home *** CD-ROM | disk | FTP | other *** search
/ IRIX Installation Tools & Overlays 1999 May / SGI IRIX Installation Tools & Overlays 1999 May - Disc 2.iso / relnotes / performer_eoe / ch5.z / ch5
Text File  |  1999-04-19  |  135KB  |  3,103 lines

  1.  
  2.  
  3.  
  4.                                   - 1 -
  5.  
  6.  
  7.  
  8.        6.  _C_h_a_n_g_e_s__f_r_o_m__P_r_e_v_i_o_u_s__R_e_l_e_a_s_e_s
  9.  
  10.        This Chapter identifies incremental changes and enhancements
  11.        since IRIS Performer 2.0.  Changes are presented in reverse
  12.        chronological order, with the most recent releases listed
  13.        first.
  14.  
  15.  
  16.        6.1  _C_h_a_n_g_e_s__i_n__I_R_I_S__P_e_r_f_o_r_m_e_r__2_._2_._5
  17.  
  18.        6.1.1  _P_r_o_b_l_e_m_s__f_i_x_e_d__i_n__I_R_I_S__P_e_r_f_o_r_m_e_r__2_._2_._5
  19.  
  20.           +o pfFrustum::makeOrtho() calculated incorrect near/far
  21.             clip plane values.  This has been fixed (SCR 658920).
  22.  
  23.           +o pfGetStage() could return incorrect values due to the
  24.             Performer clock being included in the process list.
  25.             This has been fixed (SCR 668773).
  26.  
  27.           +o Channel-CULL callbacks registered from the .ct loader
  28.             could collide when used in multi-channel
  29.             configurations, resulting in the incorrect calculations
  30.             of texture coordinates.  This regression has been fixed
  31.             (SCR 668222).
  32.  
  33.           +o perfly, asdfly, and clipfly could not configure multi-
  34.             hyperpipe systems.  This capability has been added (SCR
  35.             675711).
  36.  
  37.           +o Draw statistics were only being accumulated for the
  38.             first pipe in a hyperpipe group.  This has been fixed
  39.             (SCR 675517).
  40.  
  41.           +o A garbage frame would sometimes be seen when using
  42.             texture from a DIVO source in Performer on Onyx2
  43.             systems with 'Reality' graphics.  This was due to a
  44.             mismatch in Performer's automatic detection of graphics
  45.             type and has been fixed (SCR 671095).
  46.  
  47.           +o The default displacement offset for coplanar polygons
  48.             was set too large for small frusta.  This has been
  49.             fixed (SCR 625598, 670200).  See below for
  50.             configuration details.
  51.  
  52.           +o Several additional improvements to the multipass
  53.             algorithm used for projective texture pfLightSources
  54.             have been made in 2.2.5.  In particular, the algorithm
  55.             now supports geometry with texture based transparency
  56.             (for example, a tree billboard).
  57.  
  58.  
  59.  
  60.  
  61.  
  62.  
  63.  
  64.  
  65.  
  66.  
  67.  
  68.  
  69.  
  70.                                   - 2 -
  71.  
  72.  
  73.  
  74.        6.1.2  _N_e_w__f_e_a_t_u_r_e_s__i_n__I_R_I_S__P_e_r_f_o_r_m_e_r__2_._2_._5
  75.  
  76.        6.1.2.1  _S_u_p_p_o_r_t__f_o_r__O_p_e_n_G_L__1_._1__g_l_P_o_l_y_g_o_n_O_f_f_s_e_t_(_)
  77.  
  78.        This release modifies the routines used for coplanar polygon
  79.        displacement to one based upon the polygon offset
  80.        functionality in OpenGL 1.1.  The changes apply to all
  81.        platforms using OpenGL 1.1 except the Impact series.
  82.  
  83.        Users may revert to the prior (Performer 2.2) behavior by
  84.        setting the environment variable
  85.        PF_FORCE_EXT_POLYGON_OFFSET.
  86.  
  87.        Likewise, users may choose to force the new functionality to
  88.        be used on Impact systems (despite known bugs at this time)
  89.        by setting the environment variable
  90.        PF_FORCE_ARB_POLYGON_OFFSET.
  91.  
  92.        In case the results of the new offset behavior are not ideal
  93.        for a particular system or database, users may tune the
  94.        values set internally by IRIS Performer.  The environment
  95.        variables PF_ARB_POLYGON_OFFSET_FACTOR and
  96.        PF_ARB_POLYGON_OFFSET_UNITS can be set to floating point
  97.        values which will then be used internally as arguments to
  98.        glPolygonOffset().  See the glPolygonOffset(3G) man page for
  99.        further details of the effect of these settings.
  100.  
  101.        Although the OpenGL 1.1 glPolygonOffset() changes were
  102.        intended to resolve machine dependency issues, please note
  103.        that the ideal offset factor and units value may still vary
  104.        from system to system.  The glPolygonOffset() values set by
  105.        IRIS Performer were chosen for typical database settings on
  106.        InfiniteReality systems and may require adjustment on other
  107.        OpenGL 1.1 systems, using the environment variables
  108.        described above.
  109.  
  110.  
  111.        6.2  _C_h_a_n_g_e_s__i_n__I_R_I_S__P_e_r_f_o_r_m_e_r__2_._2_._4
  112.  
  113.        6.2.1  _P_r_o_b_l_e_m_s__f_i_x_e_d__i_n__I_R_I_S__P_e_r_f_o_r_m_e_r__2_._2_._4
  114.  
  115.           +o The Performer signal handler would enter an infinite
  116.             loop if a process forked or sproc'd from the APP
  117.             process exited.  This has been fixed (SCR 651566).
  118.  
  119.           +o Setting the PF_LPOINT_BOARD environment variable to
  120.             enable emulation of calligraphic hardware (by using
  121.             standard raster light points) had no effect.  This has
  122.             been fixed (SCR 615443).
  123.  
  124.  
  125.  
  126.  
  127.  
  128.  
  129.  
  130.  
  131.  
  132.  
  133.  
  134.  
  135.  
  136.                                   - 3 -
  137.  
  138.  
  139.  
  140.           +o Threading the lightpoint process caused a segmentation
  141.             fault.  This has been fixed.
  142.  
  143.           +o Models containing pfLightPoints with a NULL
  144.             pfLPointState could cause a segmentation violation on
  145.             O2 systems running IRIX 6.5.2.  This has been fixed
  146.             (SCR 614274).
  147.  
  148.           +o Several improvements to the multipass algorithm used
  149.             for projective texture pfLightSources have been made.
  150.             Colored spotlights now interact correctly with each
  151.             other.  Note that the current algorithm does not
  152.             support geometry with texture based transparency (for
  153.             example, a tree billboard), and can only produce
  154.             translucent geometry on systems with multisampling
  155.             capability.
  156.  
  157.           +o Several pfStats::query() tokens were unimplemented.
  158.             Most of the missing tokens can now be used to query
  159.             statistics.  The following will still return an error:
  160.  
  161.                +o PFSTATSVAL_CPU_SECS
  162.                  PFSTATSVAL_CPU_GFX_SWAPBUFFERS
  163.                  PFSTATSVAL_GFXPIPE_TIMES_PERCENTAGE
  164.                  PFSTATSVAL_GFXPIPE_TIMES_PERCENTAGE_HOST
  165.                  PFSTATSVAL_GFXPIPE_TIMES_PERCENTAGE_XFORM
  166.                  PFSTATSVAL_GFXPIPE_TIMES_PERCENTAGE_FILL
  167.                  PFSTATSVAL_GFXPIPE_TIMES_SECS
  168.                  PFSTATSVAL_GFXPIPE_TIMES_SECS_HOST
  169.                  PFSTATSVAL_GFXPIPE_TIMES_SECS_XFORM
  170.                  PFSTATSVAL_GFXPIPE_TIMES_SECS_FILL
  171.  
  172.           +o IRIX 6.5 introduced support for the concurrent use of
  173.             shared arenas and POSIX threads (pthreads), however
  174.             there was an error in the GLX implementation which
  175.             prevented IRIS Performer applications from opening a
  176.             window if the pthread library was linked.  The GLX
  177.             implementation in the IRIX 6.5.3 overlay has addressed
  178.             this problem, so IRIS Performer applications can now be
  179.             safely used with pthreads.
  180.  
  181.           +o The CSB loader has been updated to enable the use of
  182.             ClearCoat(tm).
  183.  
  184.           +o Graphics state information could "leak" from a
  185.             cliptexture to other models in the scene.  This has
  186.             been fixed (SCR 603185).
  187.  
  188.  
  189.  
  190.  
  191.  
  192.  
  193.  
  194.  
  195.  
  196.  
  197.  
  198.  
  199.  
  200.  
  201.  
  202.                                   - 4 -
  203.  
  204.  
  205.  
  206.        6.2.2  _N_e_w__F_e_a_t_u_r_e_s__i_n__I_R_I_S__P_e_r_f_o_r_m_e_r__2_._2_._4
  207.  
  208.        6.2.2.1  _S_u_p_p_o_r_t__f_o_r__D_P_L_E_X__o_p_t_i_o_n
  209.  
  210.        Performer 2.2.4 includes support for the DPLEX option to
  211.        Onyx2 Infinite Reality. This support has been affected
  212.        without changes to the API, and modifications to the
  213.        command-line options for perfly, clipfly, and asdfly have
  214.        been made to enable DPLEX. There are, however, some changes
  215.        to the semantics of _p_f_P_i_p_e, _p_f_P_i_p_e_W_i_n_d_o_w, and _p_f_C_h_a_n_n_e_l
  216.        interaction.  This change is described below.
  217.  
  218.        Initialization of the hyperpipe is via the existing
  219.        pfHyperpipe() API.  This call defines the number of _p_f_P_i_p_es
  220.        to combine into a single hyperpipe.  Each call to
  221.        pfHyperpipe() defines a separate hyperpipe instance. For
  222.        example, two calls to pfHyperpipe() with an argument of 2
  223.        would define two hyperpipes of 2 _p_f_P_i_p_es each to Performer.
  224.        Like pfMultipipe(), this routine can only be invoked prior
  225.        to pfConfig().  Additionally, the _p_f_P_i_p_es of the hyperpipes
  226.        will be the lowest numbered _p_f_P_i_p_es, with any non-hyperpipe
  227.        _p_f_P_i_p_es appearing at the end.
  228.  
  229.        The first (lowest numbered) _p_f_P_i_p_e of the hyperpipe is the
  230.        master.  In the above example, that would be _p_f_P_i_p_es 0 and
  231.        2.  All control of the hyperpipe should be made through the
  232.        master _p_f_P_i_p_e. For example, to construct a _p_f_P_i_p_e_W_i_n_d_o_w for
  233.        a hyperpipe, the application can simply create it on the
  234.        master _p_f_P_i_p_e. The cloned _p_f_P_i_p_e_W_i_n_d_o_ws for each _p_f_P_i_p_e in
  235.        the hyperpipe will be created automatically. While allowed,
  236.        constructing a _p_f_P_i_p_e_W_i_n_d_o_w on a non-master pipe of the
  237.        hyperpipe will lead to undefined results.
  238.  
  239.        Hyperpipes differ from other multipipe configurations in one
  240.        other very important way. The set of _p_f_C_h_a_n_n_e_l_s displayed on
  241.        the hyperpipe is shared amongst all of the _p_f_P_i_p_e_s in the
  242.        hyperpipe.  That is, it is only necessary to create and set
  243.        _p_f_C_h_a_n_n_e_l objects on the master _p_f_P_i_p_e of the hyperpipe.
  244.        Since the hyperpipe is a time multiplexed view of these
  245.        channels, Performer will propagate changes in the _p_f_C_h_a_n_n_e_l
  246.        to each of the _p_f_P_i_p_e_s in turn.
  247.  
  248.        The following code snippet identifies the steps needed to
  249.        setup a multi-hyperpipe config. It assumes that each of the
  250.        hyperpipes are symetric (i.e., have the same number of
  251.        pipes), although this is not required by Performer.
  252.  
  253.  
  254.        ////****
  255.         **** LLLLooooccccaaaallll ddddeeeeccccllllaaaarrrraaaattttiiiioooonnnnssss
  256.         ****////
  257.  
  258.  
  259.  
  260.  
  261.  
  262.  
  263.  
  264.  
  265.  
  266.  
  267.  
  268.                                   - 5 -
  269.  
  270.  
  271.  
  272.        iiiinnnntttt iiii;;;;
  273.        ppppffffCCCChhhhaaaannnnnnnneeeellll**** mmmmaaaasssstttteeeerrrrCCCChhhhaaaannnn;;;;
  274.        ppppffffPPPPiiiippppeeeeWWWWiiiinnnnddddoooowwww**** mmmmaaaasssstttteeeerrrrPPPPWWWWiiiinnnn;;;;
  275.  
  276.        ////****
  277.         **** TTTThhhheeee ffffoooolllllllloooowwwwiiiinnnngggg aaaassssssssuuuummmmeeeessss tttthhhhaaaatttt hhhhyyyyppppeeeerrrrppppiiiippppeeeeCCCCoooouuuunnnntttt iiiissss tttthhhheeee nnnnuuuummmmbbbbeeeerrrr ooooffff
  278.         **** hhhhyyyyppppeeeerrrrppppiiiippppeeeessss ttttoooo ccccoooonnnnffffiiiigggguuuurrrreeee aaaannnndddd hhhhyyyyppppeeeerrrrppppiiiippppeeeePPPPiiiippppeeeeCCCCoooouuuunnnntttt iiiissss tttthhhheeee nnnnuuuummmmbbbbeeeerrrr
  279.         **** ppppiiiippppeeeessss ppppeeeerrrr hhhhyyyyppppeeeerrrrppppiiiippppeeee....
  280.         ****////
  281.        iiiinnnntttt ppppiiiippppeeeeCCCCoooouuuunnnntttt ==== hhhhyyyyppppeeeerrrrppppiiiippppeeeeCCCCoooouuuunnnntttt****hhhhyyyyppppeeeerrrrppppiiiippppeeeePPPPiiiippppeeeeCCCCoooouuuunnnntttt;;;;
  282.  
  283.        ffffoooorrrr ((((iiii ==== 0000;;;; iiii <<<< hhhhyyyyppppeeeerrrrppppiiiippppeeeeCCCCoooouuuunnnntttt;;;; iiii++++++++))))
  284.            ppppffffHHHHyyyyppppeeeerrrrppppiiiippppeeee((((hhhhyyyyppppeeeerrrrppppiiiippppeeeePPPPiiiippppeeeeCCCCoooouuuunnnntttt))));;;;
  285.  
  286.        ////****
  287.         **** CCCCoooonnnnffffiiiigggguuuurrrreeee PPPPeeeerrrrffffoooorrrrmmmmeeeerrrr
  288.         ****////
  289.        ppppffffCCCCoooonnnnffffiiiigggg(((())));;;;
  290.  
  291.        ////****
  292.         **** CCCCoooonnnnffffiiiigggguuuurrrreeee tttthhhheeee ssssccccrrrreeeeeeeennnnssss ffffoooorrrr tttthhhheeee ppppffffPPPPiiiippppeeeessss
  293.         ****
  294.         **** AAAAssssssssuuuummmmeeeessss aaaallllllll ssssaaaammmmeeee ddddiiiissssppppllllaaaayyyy aaaannnndddd ssssccccrrrreeeeeeeennnn aaaassssssssiiiiggggnnnnmmmmeeeennnnttttssss tttthhhhaaaatttt mmmmaaaapppp
  295.         **** ttttoooo ppppffffPPPPiiiippppeeee nnnnuuuummmmbbbbeeeerrrr
  296.         ****////
  297.        ffffoooorrrr ((((iiii ==== 0000;;;; iiii <<<< ppppiiiippppeeeeCCCCoooouuuunnnntttt;;;; iiii++++++++))))
  298.            ppppffffPPPPiiiippppeeeeSSSSccccrrrreeeeeeeennnn((((ppppffffGGGGeeeettttPPPPiiiippppeeee((((iiii)))),,,, iiii))));;;;  //////// aaaassssssssuuuummmmeeeessss aaaallllllll oooonnnn ssssaaaammmmeeee ddddiiiissssppppllllaaaayyyy
  299.  
  300.        ////****
  301.         **** CCCCoooonnnnffffiiiigggguuuurrrreeee aaaa tttthhhhrrrreeeeeeee,,,, ttttwwwwoooo----ppppiiiippppeeee hhhhyyyyppppeeeerrrrppppiiiippppeeee ffffoooorrrr mmmmuuuullllttttiiii----cccchhhhaaaannnnnnnneeeellll ddddiiiissssppppllllaaaayyyy....
  302.         ****////
  303.        ffffoooorrrr ((((iiii ==== 0000;;;; iiii <<<< ppppiiiippppeeeeCCCCoooouuuunnnntttt;;;; iiii ++++==== hhhhyyyyppppeeeerrrrppppiiiippppeeeePPPPiiiippppeeeeCCCCoooouuuunnnntttt)))) {{{{
  304.            ppppffffPPPPiiiippppeeee**** pppp;;;;
  305.            ppppffffPPPPiiiippppeeeeWWWWiiiinnnnddddoooowwww**** ppppwwww;;;;
  306.            ppppffffCCCChhhhaaaannnnnnnneeeellll**** cccchhhhaaaannnn;;;;
  307.            iiiinnnntttt sssshhhhaaaarrrreeee;;;;
  308.            PPPPFFFFVVVVEEEECCCC3333 xxxxyyyyzzzz,,,, hhhhpppprrrr;;;;
  309.  
  310.            pppp ==== ppppffffGGGGeeeettttPPPPiiiippppeeee((((iiii))));;;;
  311.            ppppwwww ==== ppppffffNNNNeeeewwwwPPPPWWWWiiiinnnn((((pppp))));;;;
  312.            ppppffffPPPPWWWWiiiinnnnNNNNaaaammmmeeee((((ppppwwww,,,, """"HHHHyyyyppppeeeerrrrppppiiiippppeeee WWWWiiiinnnnddddoooowwww""""))));;;;
  313.            ppppffffPPPPWWWWiiiinnnnCCCCoooonnnnffffiiiiggggFFFFuuuunnnncccc((((ppppwwww,,,, OOOOppppeeeennnnPPPPiiiippppeeeeWWWWiiiinnnn))));;;;
  314.            ppppffffPPPPWWWWiiiinnnnTTTTyyyyppppeeee((((ppppwwww,,,, PPPPFFFFPPPPWWWWIIIINNNN____TTTTYYYYPPPPEEEE____XXXX))));;;;
  315.            ppppffffPPPPWWWWiiiinnnnFFFFuuuullllllllSSSSccccrrrreeeeeeeennnn((((ppppwwww))));;;;
  316.            ppppffffPPPPWWWWiiiinnnnMMMMooooddddeeee((((ppppwwww,,,, PPPPFFFFWWWWIIIINNNN____NNNNOOOOBBBBOOOORRRRDDDDEEEERRRR,,,, 1111))));;;;
  317.            ppppffffCCCCoooonnnnffffiiiiggggPPPPWWWWiiiinnnn((((ppppwwww))));;;;
  318.            iiiiffff ((((iiii ======== 0000)))) mmmmaaaasssstttteeeerrrrPPPPWWWWiiiinnnn ==== ppppwwww;;;;
  319.  
  320.            cccchhhhaaaannnn ==== ppppffffNNNNeeeewwwwCCCChhhhaaaannnn((((pppp))));;;;
  321.            sssshhhhaaaarrrreeee ==== ppppffffGGGGeeeettttCCCChhhhaaaannnnSSSShhhhaaaarrrreeee((((cccchhhhaaaannnn))));;;;
  322.            sssshhhhaaaarrrreeee ||||==== PPPPFFFFCCCCHHHHAAAANNNN____VVVVIIIIEEEEWWWWPPPPOOOORRRRTTTT |||| PPPPFFFFCCCCHHHHAAAANNNN____SSSSWWWWAAAAPPPPBBBBUUUUFFFFFFFFEEEERRRRSSSS ||||
  323.  
  324.  
  325.  
  326.  
  327.  
  328.  
  329.  
  330.  
  331.  
  332.  
  333.  
  334.                                   - 6 -
  335.  
  336.  
  337.  
  338.                     PPPPFFFFCCCCHHHHAAAANNNN____SSSSWWWWAAAAPPPPBBBBUUUUFFFFFFFFEEEERRRRSSSS____HHHHWWWW;;;;
  339.            ppppffffCCCChhhhaaaannnnSSSShhhhaaaarrrreeee((((cccchhhhaaaannnn,,,, sssshhhhaaaarrrreeee))));;;;
  340.            ppppffffMMMMaaaakkkkeeeeSSSSiiiimmmmpppplllleeeeCCCChhhhaaaannnn((((cccchhhhaaaannnn,,,, 44445555))));;;;
  341.            ppppffffCCCChhhhaaaannnnAAAAuuuuttttooooAAAAssssppppeeeecccctttt((((cccchhhhaaaannnn,,,, PPPPFFFFFFFFRRRRUUUUSSSSTTTT____CCCCAAAALLLLCCCC____VVVVEEEERRRRTTTT))));;;;
  342.            ppppffffAAAAddddddddCCCChhhhaaaannnn((((ppppwwww,,,, cccchhhhaaaannnn))));;;;
  343.  
  344.            ppppffffSSSSeeeettttVVVVeeeecccc3333((((xxxxyyyyzzzz,,,, 0000,,,, 0000,,,, 0000))));;;;
  345.            ppppffffSSSSeeeettttVVVVeeeecccc3333((((hhhhpppprrrr,,,, ((((((((hhhhyyyyppppeeeerrrrppppiiiippppeeeeCCCCoooouuuunnnntttt----1111)))) **** ....5555ffff
  346.                         ---- iiii////hhhhyyyyppppeeeerrrrppppiiiippppeeeePPPPiiiippppeeeeCCCCoooouuuunnnntttt )))) **** 44445555....ffff,,,, 0000,,,, 0000))));;;;
  347.            ppppffffCCCChhhhaaaannnnVVVViiiieeeewwwwOOOOffffffffsssseeeettttssss((((cccchhhhaaaannnn,,,, xxxxyyyyzzzz,,,, hhhhpppprrrr))));;;;
  348.            iiiiffff ((((iiii ======== 0000))))
  349.                mmmmaaaasssstttteeeerrrrCCCChhhhaaaannnn ==== cccchhhhaaaannnn;;;;
  350.            eeeellllsssseeee
  351.                ppppffffAAAAttttttttaaaacccchhhhCCCChhhhaaaannnn((((mmmmaaaasssstttteeeerrrrCCCChhhhaaaannnn,,,, cccchhhhaaaannnn))));;;;
  352.        }}}}
  353.  
  354.        The remainder of the code should follow a typical multipipe
  355.        application.
  356.  
  357.        There are certain restrictions on usage of _p_f_P_i_p_es,
  358.        _p_f_P_i_p_e_W_i_n_d_o_ws and _p_f_P_i_p_e_V_i_d_e_o_C_h_a_n_n_e_ls when running in
  359.        hyperpipe mode. All actions (with the exception of graphics
  360.        pipe specific controls, e.g., pfPWinFBConfigAttrs() and
  361.        pfPWinFBConfigId) should occur on those objects associated
  362.        with the master _p_f_P_i_p_e.  In those instances where pipe
  363.        specific attributes need modification, the appropriate
  364.        pfPipeWindow or pfPipeVideoChannel can be obtained using the
  365.        indexed pfGetPipePWin and pfGetPWinPVChan functions.  The
  366.        index should equal the index of the associated master object
  367.        on the master pipe.
  368.  
  369.        There is a limitation in that changes to _p_f_P_i_p_e_W_i_n_d_o_ws
  370.        affected by the draw process will not be propagated to other
  371.        _p_f_P_i_p_e_W_i_n_d_o_ws in the hyperpipe. Also, statistics drawn by
  372.        the _p_f_F_r_a_m_e_S_t_a_t_s will reflect only the times for a
  373.        particular draw process and not the entire hyperpipe. These
  374.        problems may be removed in a later release.
  375.  
  376.  
  377.        6.3  _C_h_a_n_g_e_s__i_n__I_R_I_S__P_e_r_f_o_r_m_e_r__2_._2_._3
  378.  
  379.        6.3.1  _P_r_o_b_l_e_m_s__f_i_x_e_d__i_n__I_R_I_S__P_e_r_f_o_r_m_e_r__2_._2_._3
  380.  
  381.           +o Performer 2.2 always used the channel frustum for
  382.             culling when PFCULL_GSET was set, even if a custom cull
  383.             frustum polytope was defined.  This has been fixed.
  384.             (SCR 635693)
  385.  
  386.           +o Attempting to delete a cliptexture could cause a core
  387.             dump.  Cliptexture deletion is not supported, so a
  388.             DEBUG-level warning is now emitted.  (SCR 594276)
  389.  
  390.  
  391.  
  392.  
  393.  
  394.  
  395.  
  396.  
  397.  
  398.  
  399.  
  400.                                   - 7 -
  401.  
  402.  
  403.  
  404.           +o Fully transparent pfLPointStates could cause
  405.             segmentation violations in Performer 2.2.  This has
  406.             been fixed.  (SCR 614274)
  407.  
  408.           +o The FLT loader printed assertion failures such as the
  409.             following:
  410.  
  411.                +o pfdConverterMode_flt: user data slot cannot be set
  412.                  to 1
  413.  
  414.                +o pfdConverterMode_flt: private user data slot
  415.                  cannot be set to 2
  416.  
  417.             The cause of these problems has been fixed.  (SCR
  418.             624177)
  419.  
  420.           +o pfdFindConverterDSO was unable to locate the 3ds file
  421.             loader. This was the result of conflicting IL and IFL
  422.             versions and has been fixed.  (SCR 625838)
  423.  
  424.           +o The warning "pfTexture::compare(): pfClipTexture is not
  425.             a pfTexture" was emitted when comparing a pfGeoState
  426.             with cliptexture to one with a regular texture.  This
  427.             has been fixed.  (SCR 626001)
  428.  
  429.           +o Picking with orthographic viewing frusta returned
  430.             incorrect hit points.  This has been fixed.  (SCR
  431.             601650)
  432.  
  433.           +o Color fields in pfGeoSets were not being handled
  434.             correctly during the print traversal.  This has been
  435.             fixed.  (SCR 621124)
  436.  
  437.           +o pfuTravCalcBBox in trav.c did not calculate the
  438.             bounding box for pfBillboard nodes.  It now does.  (SCR
  439.             632225)
  440.  
  441.  
  442.  
  443.        6.4  _C_h_a_n_g_e_s__i_n__I_R_I_S__P_e_r_f_o_r_m_e_r__2_._2_._2
  444.  
  445.        6.4.1  _P_r_o_b_l_e_m_s__f_i_x_e_d__i_n__I_R_I_S__P_e_r_f_o_r_m_e_r__2_._2_._2
  446.  
  447.           +o _p_f_B_i_l_l_b_o_a_r_d_s were always using Z axis (Bug #591154)
  448.  
  449.           +o _p_f_P_i_p_e_W_i_n_d_o_w _r_e_s_i_z_e _w_i_t_h _f_o_r_k_e_d _c_u_l_l caused per-frame
  450.             slow X communication. (Bug #611816)
  451.  
  452.           +o _p_f_T_e_x_t_u_r_e _w_i_t_h _T_e_x_L_O_D _s_e_t_t_i_n_g_s would leak memory. (Bug
  453.             #600949)
  454.  
  455.  
  456.  
  457.  
  458.  
  459.  
  460.  
  461.  
  462.  
  463.  
  464.  
  465.  
  466.                                   - 8 -
  467.  
  468.  
  469.  
  470.           +o _p_f_U_n_r_e_f_D_e_l_e_t_e() would delete an object when its ref
  471.             count was decremented to 65536.  This has been fixed,
  472.             and the types of pfGetRef() and pfUnrefGetRef() have
  473.             been changed from ushort to int. (Bug #603177)
  474.  
  475.           +o The _l_o_o_k_a_h_e_a_d directive was ignored in no-imagecache
  476.             ._c_t _c_l_i_p _t_e_x_t_u_r_e _c_o_n_f_i_g_u_r_a_t_i_o_n _f_i_l_e_s.  _N_O_T_E: since this
  477.             is fixed, applications using .ct files containing a
  478.             lookahead command may use much more memory, and may
  479.             have to be re-tuned (or the lookahead command removed).
  480.             (Bug #576096)
  481.  
  482.           +o The CSB loader has been updated to enable loading of
  483.             files created by OpenGL Optimizer 1.2
  484.  
  485.           +o The FLT loader has been updated to version 15.4g (Bug
  486.             #615990).  Several bugs have been fixed, including:
  487.  
  488.                +o A bug in revision R15.4fi where
  489.                  pfuTexGenClipCenterNode was inserted as parent of
  490.                  root node.  In such cases the clip texture was not
  491.                  centered.
  492.  
  493.                +o A bug in revision R15.4fi where the loader's user
  494.                  data slot was not initialized.  This caused core
  495.                  dumps when certain run-time features were enabled
  496.                  such as clip planes, behaviors, and adaptive light
  497.                  points.
  498.  
  499.                +o _P_r_o_j_e_c_t_e_d _t_e_x_t_u_r_e_s behaved improperly when using
  500.                  multiple channels or when lighting was off. (Bugs
  501.                  #581332, #581334)
  502.  
  503.                +o _I_n_f _f_r_a_m_e _r_a_t_e _r_e_p_o_r_t_e_d _f_o_r _I_n_t_e_r_l_a_c_e_d _v_i_d_e_o
  504.                  _f_o_r_m_a_t_s.  Now, the current swap rate will be
  505.                  reported which for interlaced video formats might
  506.                  be faster than the requested frame rate (ie.
  507.                  60/30Hz).  (Bug #603567).
  508.  
  509.                +o _v_i_s_f_l_y _d_e_m_o was unable to start due to an
  510.                  unresolvable symbol in the compat libraries,
  511.                  pfuCalcNormalizedChanXY (Bug #600942)
  512.  
  513.                +o _B_a_d _L_i_g_h_t_i_n_g - the 2.0.6/2.1.4 compat libraries
  514.                  had bad lighting characteristics; all lit models
  515.                  were shaded grey  (Bug #598903)
  516.  
  517.                +o _p_f_d_F_i_n_d_C_o_n_v_e_r_t_e_r_D_S_O() in 2.0.6/2.1.4 was failing
  518.                  due to a lookup problem in pfdLoadFile.  (Bug
  519.                  #605958)
  520.  
  521.  
  522.  
  523.  
  524.  
  525.  
  526.  
  527.  
  528.  
  529.  
  530.  
  531.  
  532.                                   - 9 -
  533.  
  534.  
  535.  
  536.                +o _6_4_b_i_t _o_p_e_r_a_t_i_o_n _w_i_t_h _I_R_I_X _6._5 could fail with IRIS
  537.                  Performer 2.0 and 2.1 libraries.  This is fixed in
  538.                  the IRIS Performer libraries that were shipped
  539.                  with IRIX 6.5 and also in the 2.0.7/2.1.5
  540.                  libraries.
  541.  
  542.  
  543.        6.5  _C_h_a_n_g_e_s__i_n__I_R_I_S__P_e_r_f_o_r_m_e_r__2_._2_._1
  544.  
  545.        6.5.1  _P_r_o_b_l_e_m_s__f_i_x_e_d__i_n__I_R_I_S__P_e_r_f_o_r_m_e_r__2_._2_._1
  546.  
  547.           +o _a_s_d_f_l_y _z_b_u_f_f_e_r _p_r_o_b_l_e_m_s _o_n _i_R due to a lose layer
  548.             offset call in asdfly/terrain.c. (Bug #575993)
  549.  
  550.           +o _M_u_l_t_i_p_i_p_e _C_a_l_l_i_g_r_a_p_h_i_c_s supports 10 pipes instead of
  551.             just 3.  (Bug #559773)
  552.  
  553.           +o _M_u_l_t_i_p_i_p_e _p_f_G_e_t_S_c_r_e_e_n() _r_e_t_u_r_n_i_n_g (-_1)_i_n _d_r_a_w _s_t_a_g_e
  554.             _c_a_l_l_b_a_c_k _i_n_i_t..
  555.  
  556.           +o _O_p_e_n_W_o_r_l_d_s _V_R_M_L _2._0 (._w_r_l) _l_o_a_d_e_r failed for N32 and
  557.             N64 due to default library search path
  558.             (/usr/lib[32,64]. (Bug #575792)
  559.  
  560.           +o _O_p_e_n_F_l_i_g_h_t (._f_l_t) _l_o_a_d_e_r _w_i_t_h _a_u_t_o_m_a_t_i_c _c_l_i_p_t_e_x_t_u_r_e
  561.             _c_e_n_t_e_r_i_n_g could dump core if pfuInit() was not called
  562.             by the application before pfConfig().  (Bug #575589)
  563.  
  564.           +o _O_p_e_n_F_l_i_g_h_t (._f_l_t) _l_o_a_d_e_r _u_s_i_n_g _n_e_w _1_5._4 _f_e_a_t_u_r_e_s could
  565.             dump core due to lack of initialization of user data
  566.             slot used for behaviors and clip planes.  (Bug #575586)
  567.  
  568.           +o _X_s_g_i_v_c _V_i_d_e_o _C_h_a_n_n_e_l _0 had to exist or Performer would
  569.             hang on startup.  This also caused hangs on OCTANE OCO
  570.             (multi-channel operation).  (Bug #577815)
  571.  
  572.           +o _N_6_4 _V_i_d_e_o _c_h_a_n_n_e_l _o_p_e_r_a_t_i_o_n_s would dump core (Bug
  573.             #575616).  To see this fix on IRIX 6.2 or IRIX 6.4,
  574.             additional X and GL patches are required.
  575.  
  576.           +o _I_n _O_c_t_a_n_e _O_C_O _m_o_d_e  _o_r _n_o _v_i_d_e_o _c_h_a_n_n_e_l  would result
  577.             in no pfPipeWindow being opened. (Bug #577065).
  578.  
  579.           +o _D_V_R _s_h_o_w_i_n_g _n_o_i_s_e _o_n _b_o_t_t_o_m _l_i_n_e_s _o_f _v_i_d_e_o. (Bug
  580.             #577976).
  581.  
  582.           +o _p_f_i_S_p_h_e_r_i_c _m_o_t_i_o_n _m_o_d_e_l _t_r_a_n_s_i_t_i_o_n (rail) tracking was
  583.             too fast for really slow speeds (in the range of
  584.             0.000001).  (Bug #583127).
  585.  
  586.  
  587.  
  588.  
  589.  
  590.  
  591.  
  592.  
  593.  
  594.  
  595.  
  596.  
  597.  
  598.                                   - 10 -
  599.  
  600.  
  601.  
  602.        6.5.2  _P_r_o_b_l_e_m_s _f_i_x_e_d _i_n _2._0._6 _a_n_d _2._1._4 (_s_h_i_p_p_e_d _w_i_t_h
  603.        _2._2._1)
  604.  
  605.           +o _p_f_u_C_o_n_f_i_g_M_C_O now properly initializes multiple channels
  606.             on multiple pipes. (Bug #564062)
  607.  
  608.           +o _p_f_W_i_n_d_o_w::_g_e_t_F_B_C_o_n_f_i_g_A_t_t_r_s() was core dumping on
  609.             pbuffers.  It will now return NULL for a pbuffer since
  610.             the attribute arrays is for XVisuals and pbuffers
  611.             require GLXFBConfigSGIXs which should be specified with
  612.             pfWindow::setFBConfig(). (Bug #575989)
  613.  
  614.           +o _p_f_u_S_a_v_e_I_m_a_g_e _i_n _N_6_4 didn't work due to bad pointer
  615.             types in libpfutil/snapwin.c. (Bug #575243)
  616.  
  617.           +o _N_6_4 _p_l_a_c_e_m_e_n_t _o_f _p_f_D_a_t_a_P_o_o_l_s could cause brk to run out
  618.             of space for heap area. (Bug #575065)
  619.  
  620.  
  621.        6.6  _C_h_a_n_g_e_s__i_n__I_R_I_S__P_e_r_f_o_r_m_e_r__2_._2
  622.  
  623.        6.6.1  _I_R_I_S__P_e_r_f_o_r_m_e_r__2_._0_._4__P_r_o_b_l_e_m_s__f_i_x_e_d__i_n__2_._0_._5__a_n_d__2_._2
  624.  
  625.  
  626.           +o _p_f_I_n_i_t_C_l_o_c_k in 250MHz IMPACT use not to be consistent.
  627.  
  628.           +o _P_i_c_k_i_n_g models with LOD unded DCS used to fail with
  629.             large DCS translations (bug#455490)
  630.  
  631.           +o _p_f_T_e_x_t_u_r_e sometime failed to restore to the global
  632.             texture.
  633.  
  634.           +o _p_f_B_o_x contains function has been fixed
  635.  
  636.           +o _D_a_t_a_P_o_o_l were not aligned on 64 bits, generating core
  637.             dump if the application store double float in the
  638.             datapool.
  639.  
  640.           +o Some _q_u_e_r_y feature request were missing, 2.0.5 is now
  641.             at the same level as 2.2.
  642.  
  643.           +o Assigning a Drawable without a visual used to cause the
  644.             window not to open. (bug# 450891)
  645.  
  646.           +o Full screen had a window border when compiling for N64.
  647.             (bug #542372)
  648.  
  649.           +o _p_b_u_f_f_e_r were not fully supported.
  650.  
  651.  
  652.  
  653.  
  654.  
  655.  
  656.  
  657.  
  658.  
  659.  
  660.  
  661.  
  662.  
  663.  
  664.                                   - 11 -
  665.  
  666.  
  667.  
  668.        6.6.2  _I_R_I_S__P_e_r_f_o_r_m_e_r__2_._1_._2__P_r_o_b_l_e_m_s__f_i_x_e_d__i_n__2_._1_._3__a_n_d__2_._2
  669.  
  670.  
  671.           +o When the first video channel on a graphic pipeline was
  672.             not active, _p_f_P_i_p_e_V_i_d_e_o_C_h_a_n_n_e_l was failing under forked
  673.             DRAW multi-process.
  674.  
  675.           +o _A_S_D _T_e_r_r_a_i_n was not supporting dynamic paging. This
  676.             fixed so ASD tiles can be dynamically paged in the
  677.             DBASE prmcess.
  678.  
  679.           +o _A_S_D _T_e_r_r_a_i_n was not working on multipipe. This is fixed
  680.             and ASD works fine with multiple pipes/channels. _a_s_d_f_l_y
  681.             is fixed as well.
  682.  
  683.           +o _V_e_r_t_e_x _a_r_r_a_y_s used in a GL display list used to produce
  684.             invalid normals.  This has been fixed in OpenGL with
  685.             patch 1808 or later.
  686.  
  687.           +o _p_f_T_e_x_t_u_r_e sometime failed to restore to the global
  688.             texture.
  689.  
  690.           +o _p_f_B_o_x contains function has been fixed
  691.  
  692.           +o _D_a_t_a_P_o_o_l were not aligned on 64 bits, generating core
  693.             dump if the application store double float in the
  694.             datapool.
  695.  
  696.           +o Full screen had a window border when compiling for N64.
  697.             (bug #542372)
  698.  
  699.           +o Some _q_u_e_r_y feature request were missing, 2.1.3 is now
  700.             at the same level as 2.2.
  701.  
  702.           +o _M_o_t_i_f decoration hints used not to work in 64 bits N64.
  703.  
  704.  
  705.        6.6.3  _O_t_h_e_r__P_r_o_b_l_e_m_s__f_i_x_e_d__i_n__2_._2
  706.  
  707.           +o _I_n_v_e_n_t_o_r loader used not to work N32/N64. (bug# 434322)
  708.  
  709.           +o _G_a_n_g_S_w_a_p was not working at all for OpenGL. This is
  710.             fixed in performer and in OpenGL after patch 1808.
  711.  
  712.           +o _p_e_r_f_l_y did not accept input from other screens than the
  713.             master screen. (bug# 459186)
  714.  
  715.           +o _E_a_r_t_h_S_k_y used not to propagate the right fog values in
  716.             sync to all screens in multipipe mode (bug# 437747)
  717.  
  718.  
  719.  
  720.  
  721.  
  722.  
  723.  
  724.  
  725.  
  726.  
  727.  
  728.  
  729.  
  730.                                   - 12 -
  731.  
  732.  
  733.  
  734.           +o _s_h_a_d_o_w _t_e_x_t_u_r_e_s used not to be implemented for
  735.             InfiniteReality/OpenGL.
  736.  
  737.           +o _p_f_c_o_n_v did core dump or go in infinite loop when
  738.             converting some inventor files. (bug# 435232)
  739.  
  740.           +o _g_l_o_b_a_l _s_t_a_t_e used not to work properly and be in
  741.             conflict with channel state (see option -q0 in perfly).
  742.             (bug# 423829)
  743.  
  744.           +o _B_i_n_s used to have many problems. Bin number had to be
  745.             in successive numbers (bug# 416557), bin Order had no
  746.             effect at all, there was no way to draw the objects
  747.             that are not falling into a bin (can be done in 2.2
  748.             using pfDrawBin(-1)), there was no way to know which
  749.             bins are in used (pfGetFreeBin() gets that information
  750.             in 2.2). Note that 2.2 has a predefined #3 bin: the
  751.             Light Point bin, and that this bin has a very special
  752.             behavior and cannot be used for general purpose.
  753.  
  754.           +o _p_f_A_S_D used to only handle terrain with less than 65000
  755.             vertices.
  756.  
  757.           +o _p_f_d_B_u_i_l_d_A_S_D used to have memory corruptions.
  758.  
  759.           +o _D_V_R used to produce garbage when used on a screen
  760.             larger than 1280 pixels. Performer now prevent scaling
  761.             in X direction as the hardware does not support it. It
  762.             is not going to be fixed in OpenGL, it is a HW
  763.             bandwidth limitation.
  764.  
  765.           +o _g_l_N_o_r_m_a_l_i_z_e was turned on by default, resulting in a
  766.             minimal loss of performances. Now it is automatically
  767.             turned on only when the current transformation matrix
  768.             includes scaling, and turned off otherwise.
  769.  
  770.           +o Some _p_f_M_a_t_h routines were slower than system libmath
  771.             routines that are now very optimized. The corresponding
  772.             pfMath routines are replaced by a #define that calls
  773.             system math routines directly.
  774.  
  775.           +o _C_l_i_p_t_e_x_t_u_r_e have been upgraded to production standards
  776.             for IRIS Performer 2.2. The core cliptexture
  777.             functionality has been respecified to tighter
  778.             tolerances, critical functionality such as load control
  779.             and virtual cliptextures has been added, and additional
  780.             API in libpfutil and libpfdu has been put in to make
  781.             cliptextures easier to use in production applications.
  782.  
  783.           +o _p_e_r_f_l_y -_t now allows specification of visual ID for
  784.             each pipe as a comma-separated list.
  785.  
  786.  
  787.  
  788.  
  789.  
  790.  
  791.  
  792.  
  793.  
  794.  
  795.  
  796.                                   - 13 -
  797.  
  798.  
  799.  
  800.           +o _p_f_F_o_n_t._h in previous versions was missing some internal
  801.             fields in the class declaration that would cause
  802.             problems for C++ user code creating pfFont structures
  803.             and the allocates structures would not be the proper
  804.             size.
  805.  
  806.  
  807.  
  808.        6.6.4  _D_i_f_f_e_r_e_n_c_e_s__B_e_t_w_e_e_n__2_._2__a_n_d__2_._0_/_2_._1
  809.        IRIS Performer 2.1 is an enhanced version of the IRIS
  810.        Performer 2.0 release designed in conjunction with the Onyx
  811.        InfiniteReality graphics hardware. It is, in essence,
  812.        "Performer 2.0 with InfiniteReality extensions." Unlike IRIS
  813.        Performer 2.1 that was only for InfiniteReality, the new
  814.        IRIS Performer 2.2 is an enhanced version of IRIS Performer
  815.        2.0/2.1 that runs on all SGI plateformes, enabling hardware
  816.        specific features (DVR, ClipMapping) only when supported
  817.        directly by the Graphic Subsystem.  IRIS Performer 2.2 has
  818.        numerous improvements and new features over 2.0/2.1 such as
  819.        pfFlux, pfb/pfi file formats, compute process for ASD,
  820.        Calligraphic light support....  IRIS Performer 2.0 API is
  821.        almost unchanged into 2.2, but it is not the case for 2.1 as
  822.        the ClipMapping and ASD have had a lot of API changes.
  823.  
  824.  
  825.        6.6.4.1  _C_l_i_p_T_e_x_t_u_r_e
  826.  
  827.        InfiniteReality supports very large textures through a
  828.        virtual mipmapped texture scheme we call cliptexturing. Here
  829.        is a preview of the basic concepts.
  830.  
  831.        Clip Textures provide a way use texture maps too large to
  832.        hold in graphics texture memory. Until now, to use a large
  833.        texture, you had to break it into tiles, bringing in the
  834.        next texture as you approached a tile boundary.  This
  835.        approach has numerous problems, including what to do about
  836.        polygons that span texture tile boundaries, properly
  837.        handling the changes in texture coordinates, doing
  838.        MIPMapping without visual artifacts, etc.  Performer Clip
  839.        Textures solve these problems. They allow you to seamlessly
  840.        use a very large texture, letting performer handle the
  841.        loading issues.  Since it is one continuous texture, there
  842.        are no problems with texture seams or changes in texture
  843.        coordinates.
  844.  
  845.        A clip texture can be thought of as a very large mipmapped
  846.        texture. The dimensions of level 0, the highest resolution
  847.        level of the texture, is the clip texture's *virtual size*.
  848.        For any given scene, only a subset of the entire clip
  849.        texture is visible to the observer. pfClipTextures augment
  850.        pfTextures by adding the notion of a center, a location in
  851.  
  852.  
  853.  
  854.  
  855.  
  856.  
  857.  
  858.  
  859.  
  860.  
  861.  
  862.                                   - 14 -
  863.  
  864.  
  865.  
  866.        texel space that is close to the observer. As the center
  867.        moves, the cliptexture must repeatedly applied, to update
  868.        the texels in texture memory, so that contains the texels
  869.        surrounding the current center.
  870.  
  871.        With the center properly updated, only a subset of the
  872.        entire cliptexture need be loaded into texture memory at any
  873.        given time. The visible region of this texture is called the
  874.        *clip region*. The contents of this region are updated as
  875.        the cliptexture center changes, always keeping the
  876.        surrounding texel data available to the texturing hardware.
  877.        The clip region can be visualized as a fixed width square
  878.        column cutting through the mipmap levels. At the coarsest
  879.        levels, where the MIPmap level becomes smaller than the clip
  880.        region size, the cliptexture is a normal MIPmap pyramid. As
  881.        the center moves on level 0, the column shears so that it
  882.        surrounds the center, each level moving half as fast as the
  883.        finer level above it.
  884.  
  885.        The texture itself is stored on disk and system memory as
  886.        *tiles*. One or more tiles are stored as *texture tile
  887.        files* on disk, and are brought into system memory as
  888.        needed. A cache of these tiles, called the *memory region*
  889.        is kept in system memory to reduce disk latency. A subset of
  890.        the memory region texels, the *texture region* are
  891.        downloaded to the graphics hardware texture memory.
  892.  
  893.        Each level of the clip texture larger than the clip size is
  894.        contained in an level updated with the proper texel data,
  895.        based on the center position at that level. The image cache
  896.        must download texel data as tiles from the appropriate
  897.        texture data files, keeping the mem region updated, and use
  898.        texture subloads to update texel data from the texture
  899.        region into proper area of hardware texture memory.  The
  900.        clip texture itself is composed of image caches and image
  901.        tiles. The image tiles describe the levels of the mipmap
  902.        pyramid that are equal to or smaller than the clip region.
  903.        It updates the clip texture center, and commands the image
  904.        caches to reapply the texture memory as the center changes.
  905.  
  906.        The application can configure a clip texture by loading
  907.        _c_o_n_f_i_g_u_r_a_t_i_o_n _f_i_l_e_s, contains information about the texel
  908.        data, cliptexture sizes, and texture file names and
  909.        locations. A configured cliptexture can be used in the scene
  910.        graph like a normal pfTexture. The application can attach
  911.        mpcliptextures to cliptextures, and pipes to mpcliptextures
  912.        automates the cliptexture apply process each frame, and
  913.        allows cliptexture updates to be done in the application
  914.        process. Every frame, the application updates the
  915.        mpcliptexture _c_l_i_p_m_a_p _c_e_n_t_e_r. This can be automated by
  916.        adding _c_e_n_t_e_r _n_o_d_e_s nodes to the scenegraph.
  917.  
  918.  
  919.  
  920.  
  921.  
  922.  
  923.  
  924.  
  925.  
  926.  
  927.  
  928.                                   - 15 -
  929.  
  930.  
  931.  
  932.        Cliptextures have a load control feature called Dynamic
  933.        Texture Resolution (DTR). This feature allows clipmaps to be
  934.        roamed faster than the system bandwidth would normally
  935.        allow. DTR accomplishes this by improving the order in which
  936.        tiles are download into image caches, and selectively
  937.        blurring the cliptexture and adjusting the effective
  938.        clipsize in order to modulate the cliptextures bandwidth
  939.        requirements. DTR is controlled through a mode bitmask,
  940.        which is used to enable or disable various load control
  941.        features, and by a set of parameters that can be adjusted by
  942.        the application to tune load control performance.
  943.  
  944.        There is a special form of clipmaps, called virtual
  945.        clipmaps, which can be used to exceed some of the
  946.        limitations in maximum virtual size and number of levels
  947.        inherent in the system hardware. Virtual clipmaps trade off
  948.        larger possible cliptextures against increased complexity,
  949.        and additional interactions between the cliptexture and the
  950.        scenegraph. With virtual cliptextues, the cliptexture,
  951.        itself a virtualization of a MIPmap, is itself virtualized.
  952.        The physical cliptexture is roamed within a larger virtual
  953.        cliptexture in three dimensions; s, t, and level of detail
  954.        (LOD). This roaming is controlled by setting the center and
  955.        adjusting the virtualLOD offset. The number of physical
  956.        clipmap levels in use is controlled by adjusting the
  957.        effective levels parameter. When many levels need to be
  958.        accessed, the virtuallodoffset and other parameters can be
  959.        dynamically modified as the scenegraph is traversed, trading
  960.        off some performance for much wider range of available LOD
  961.        levels.
  962.  
  963.        Man pages to see: pfClipTexture, pfQueue, pfImageTile
  964.  
  965.        Demos to check out:
  966.  
  967.                /usr/share/Performer/data/clipdata/hunter/run_hl
  968.                /usr/share/Performer/data/clipdata/moffett/run_mof
  969.  
  970.        Sample programs to check out:
  971.  
  972.                /usr/share/Performer/src/pguide/libpr/icache.c
  973.                /usr/share/Performer/src/pguide/libpr/icache_mwin.c
  974.                /usr/share/Performer/src/pguide/libpf/cliptex.c
  975.                /usr/share/Performer/src/sample/C/perfly
  976.  
  977.        Utilities to use:
  978.  
  979.                /usr/share/Performer/src/libpfutil/cliptexture.c
  980.                /usr/share/Performer/src/libpfutil/clipcenter.c
  981.  
  982.  
  983.  
  984.  
  985.  
  986.  
  987.  
  988.  
  989.  
  990.  
  991.  
  992.  
  993.  
  994.                                   - 16 -
  995.  
  996.  
  997.  
  998.        ClipTexture Texture Data and Configuration Files:
  999.  
  1000.                /usr/share/Performer/data/clipdata/hunter
  1001.                /usr/share/Performer/data/clipdata/moffett
  1002.                *.ic - image cache configuration files
  1003.                *.ct - cliptexture configuration files
  1004.  
  1005.  
  1006.  
  1007.        6.6.4.2  _V_i_r_t_u_a_l__c_l_i_p_t_e_x_t_u_r_e_s
  1008.  
  1009.        Virtual cliptextures of up to 1<<23 (8 million) texels on a
  1010.        side are supported by IRIS Performer 2.2.  This allows a
  1011.        real cliptextures (currently limited in size by the
  1012.        InfiniteReality hardware to at most 32Kx32K texels) to be
  1013.        embedded in a larger virtual clipmap of up to 8Mx8M texels.
  1014.  
  1015.        The application controls the position of the real
  1016.        cliptexture within the virtual cliptexture by updating the
  1017.        center and the _v_i_r_t_u_a_l _L_O_D _o_f_f_s_e_t. The offset adjusts the
  1018.        real cliptexture in the LOD direction.  The real cliptexture
  1019.        can only occupy positions that are valid subsets of the
  1020.        virtual cliptexture. The number of valid locations can be
  1021.        increased by using less _e_f_f_e_c_t_i_v_e _l_e_v_e_l_s The real
  1022.        cliptexture will automatically be centered around the
  1023.        current center of the virtual cliptexture, which the
  1024.        application sets on a per-frame basis (see above).
  1025.  
  1026.        Utilities are provided for intelligently selecting where to
  1027.        offset the real clipmap within the virtual clipmap each
  1028.        frame.  For details, see the source code for
  1029.        pfuCalcSizeFinestMipLOD in libpfutil, and play with the
  1030.        "Clip LOD Offset" slider in perfly when viewing a clip
  1031.        texture bigger than 32Kx32K.
  1032.  
  1033.  
  1034.        6.6.4.3  _A_c_t_i_v_e__S_u_r_f_a_c_e__D_e_f_i_n_i_t_i_o_n
  1035.  
  1036.        A pfASD is a pfNode which can handle very large terrain
  1037.        surfaces that are described as multiple LODs.  Active
  1038.        Surface Definition accuratedly describes different portions
  1039.        of the terrain using triangles from different LODs.  The
  1040.        multiple LODs have a coherent subdivision-surfaces-like
  1041.        relationship between the neighboring levels.  pfASD contains
  1042.        a small scene graph that is generated dynamically to reflect
  1043.        the current visible geometry being rendered.
  1044.  
  1045.        These routines implement the Active Surface Definition (ASD)
  1046.        feature.  ASD defines a hierarchical structure that
  1047.        organizes all the LODs of a terrain. At run-time, ASD
  1048.        traverses the structure, selecting triangles from different
  1049.  
  1050.  
  1051.  
  1052.  
  1053.  
  1054.  
  1055.  
  1056.  
  1057.  
  1058.  
  1059.  
  1060.                                   - 17 -
  1061.  
  1062.  
  1063.  
  1064.        LODs to render the portion of the terrain that is within a
  1065.        volume of interest. Triangles are rendered either at their
  1066.        pre-stored locations, when they are in a particular LOD
  1067.        range, or at computed morphed locations, when they are
  1068.        within the morphing zone of a LOD range. There will be other
  1069.        ways to evaluate the terrain other than purely range based
  1070.        approach. The way to evaluate each vertex is the "evaluation
  1071.        function".  The evaluation function can be defined as a user
  1072.        call back function, when the default range based evaluation
  1073.        is not appropriate.
  1074.  
  1075.        An example of a user defined callback function can be found
  1076.        in
  1077.  
  1078.                /usr/share/Performer/src/sample/C/asdfly/eval_function.c
  1079.  
  1080.  
  1081.        pfASD has its own thread when user claimed multiprocessing
  1082.        mode, e.g.  PFMP_FORK_COMPUTE. Asychronizely, the evaluation
  1083.        of the structure is done in the thread and the created
  1084.        geometry (active mesh) are merged into the scenegraph
  1085.        internal to pfASD at pfFrame time.  pfASD enlarges the
  1086.        viewing frustum to accommodate the delay of evaluation.
  1087.  
  1088.        The cull of pfASD is handled together with the evaluation.
  1089.        In another word, the gsets that are generated by evaluation
  1090.        is the set of triangles that should be or soon to be
  1091.        visible.
  1092.  
  1093.        pfASD handles multichannel evaluation and ensures that
  1094.        neighboring channels will have consistently connected
  1095.        triangles.  A channel can also share the evaluated active
  1096.        mesh from another channel using pfChannel::ASDattach.  pfASD
  1097.        handles multipipe as well.
  1098.  
  1099.  
  1100.        6.6.4.4  _F_l_u_x__a_n_d__E_n_g_i_n_e
  1101.  
  1102.        A _p_f_F_l_u_x is a container for holding dynamic data.  It
  1103.        contains multiple buffers of data each associated with a
  1104.        frame number.  This allows multiple processes to each have a
  1105.        copy of the data appropriate to the frame they are working
  1106.        on. A full pfGeoSet can be fluxed pfFlux should be used
  1107.        instead of pfCycleBuffer as they do not require a copy of
  1108.        the data to be done to synchronize the stages of the process
  1109.        pipeline.
  1110.  
  1111.        A _p_f_E_n_g_i_n_e is an object that controls the dynamic data in a
  1112.        pfFlux.  A pfEngine of type PFENG_MORPH associated with a
  1113.        pfFlux replaces a pfMorph node.
  1114.  
  1115.  
  1116.  
  1117.  
  1118.  
  1119.  
  1120.  
  1121.  
  1122.  
  1123.  
  1124.  
  1125.  
  1126.                                   - 18 -
  1127.  
  1128.  
  1129.  
  1130.        see _p_f_F_l_u_x, _p_f_E_n_g_i_n_e, _p_f_F_S_C, _p_f_S_w_i_t_c_h and _p_f_L_O_D man pages.
  1131.  
  1132.  
  1133.        6.6.5  _D_i_f_f_e_r_e_n_c_e_s__B_e_t_w_e_e_n__2_._2__a_n_d__2_._1
  1134.  
  1135.  
  1136.        6.6.5.1  _C_l_i_p_M_a_p_p_i_n_g
  1137.  
  1138.        _p_f_I_m_a_g_e_C_a_c_h_e renamed some API calls (the corresponding gets
  1139.        are  not shown)
  1140.  
  1141.  
  1142.                wwwwaaaassss:::: ppppffffIIIImmmmaaaaggggeeeeCCCCaaaacccchhhheeeeOOOOrrrriiiiggggiiiinnnn
  1143.                nnnneeeewwww:::: ppppffffIIIImmmmaaaaggggeeeeCCCCaaaacccchhhheeeeMMMMeeeemmmmRRRReeeeggggiiiioooonnnnOOOOrrrrgggg
  1144.  
  1145.  
  1146.  
  1147.                wwwwaaaassss:::: ppppffffIIIImmmmaaaaggggeeeeCCCCaaaacccchhhheeeeSSSSiiiizzzzeeee
  1148.                nnnneeeewwww:::: ppppffffIIIImmmmaaaaggggeeeeCCCCaaaacccchhhheeeeMMMMeeeemmmmRRRReeeeggggiiiioooonnnnSSSSiiiizzzzeeee
  1149.  
  1150.  
  1151.  
  1152.                wwwwaaaassss:::: ppppffffIIIImmmmaaaaggggeeeeCCCCaaaacccchhhheeeeVVVVaaaalllliiiiddddRRRReeeeggggiiiioooonnnnOOOOrrrriiiiggggiiiinnnn
  1153.                nnnneeeewwww:::: ppppffffIIIImmmmaaaaggggeeeeCCCCaaaacccchhhheeeeTTTTeeeexxxxRRRReeeeggggiiiioooonnnnOOOOrrrrgggg
  1154.  
  1155.  
  1156.  
  1157.                wwwwaaaassss:::: ppppffffIIIImmmmaaaaggggeeeeCCCCaaaacccchhhheeeeVVVVaaaalllliiiiddddRRRReeeeggggiiiioooonnnnSSSSiiiizzzzeeee
  1158.                nnnneeeewwww:::: ppppffffIIIImmmmaaaaggggeeeeCCCCaaaacccchhhheeeeTTTTeeeexxxxRRRReeeeggggiiiioooonnnnSSSSiiiizzzzeeee
  1159.  
  1160.  
  1161.  
  1162.                wwwwaaaassss:::: ppppffffIIIImmmmaaaaggggeeeeCCCCaaaacccchhhheeeeVVVVaaaalllliiiiddddRRRReeeeggggiiiioooonnnnDDDDsssstttt
  1163.                nnnneeeewwww:::: ppppffffIIIImmmmaaaaggggeeeeCCCCaaaacccchhhheeeeTTTTeeeexxxx
  1164.  
  1165.  
  1166.  
  1167.                wwwwaaaassss:::: ppppffffIIIImmmmaaaaggggeeeeCCCCaaaacccchhhheeeeVVVVaaaalllliiiiddddRRRReeeeggggiiiioooonnnnDDDDssssttttSSSSiiiizzzzeeee
  1168.                nnnneeeewwww:::: ppppffffIIIImmmmaaaaggggeeeeCCCCaaaacccchhhheeeeTTTTeeeexxxxSSSSiiiizzzzeeee
  1169.  
  1170.  
  1171.  
  1172.                wwwwaaaassss:::: ppppffffIIIImmmmaaaaggggeeeeCCCCaaaacccchhhheeeeVVVViiiirrrrttttuuuuaaaallllSSSSiiiizzzzeeee
  1173.                nnnneeeewwww:::: ppppffffIIIImmmmaaaaggggeeeeCCCCaaaacccchhhheeeeIIIImmmmaaaaggggeeeeSSSSiiiizzzzeeee
  1174.  
  1175.  
  1176.  
  1177.                oooobbbbssssoooolllleeeetttteeee:::: ppppffffIIIImmmmaaaaggggeeeeCCCCaaaacccchhhheeeeCCCCeeeennnntttteeeerrrr
  1178.                oooobbbbssssoooolllleeeetttteeee:::: ppppffffIIIImmmmaaaaggggeeeeCCCCaaaacccchhhheeeeMMMMaaaaxxxxUUUUppppddddaaaatttteeeeSSSSiiiizzzzeeee
  1179.  
  1180.  
  1181.  
  1182.  
  1183.  
  1184.  
  1185.  
  1186.  
  1187.  
  1188.  
  1189.  
  1190.  
  1191.  
  1192.                                   - 19 -
  1193.  
  1194.  
  1195.  
  1196.                nnnneeeewwww:::: ppppffffIIIImmmmaaaaggggeeeeCCCCaaaacccchhhheeeeCCCCaaaallllccccTTTTeeeexxxxRRRReeeeggggiiiioooonnnn
  1197.                nnnneeeewwww:::: ppppffffIIIImmmmaaaaggggeeeeCCCCaaaacccchhhheeeeCCCCaaaallllccccMMMMeeeemmmmRRRReeeeggggiiiioooonnnn
  1198.  
  1199.  
  1200.        _p_f_Q_u_e_u_e as new functionality
  1201.  
  1202.  
  1203.                nnnneeeewwww:::: ppppffffQQQQuuuueeeeuuuueeeeSSSSoooorrrrttttMMMMooooddddeeee
  1204.                nnnneeeewwww:::: ppppffffQQQQuuuueeeeuuuueeeeSSSSoooorrrrttttFFFFuuuunnnncccc
  1205.                nnnneeeewwww:::: ppppffffQQQQuuuueeeeuuuueeeeIIIInnnnppppuuuuttttRRRRaaaannnnggggeeee
  1206.                nnnneeeewwww:::: ppppffffQQQQuuuueeeeuuuueeeeOOOOuuuuttttppppuuuuttttRRRRaaaannnnggggeeee
  1207.                nnnneeeewwww:::: ppppffffGGGGeeeettttQQQQuuuueeeeuuuueeeeSSSSoooorrrrttttPPPPrrrrooooccccPPPPIIIIDDDD
  1208.  
  1209.  
  1210.        _p_f_I_m_a_g_e_C_a_c_h_e now use sorting queus Image cache configuration
  1211.        files have a version2.0 format. The parser will run with
  1212.        either format. The new format is a little more robust and
  1213.        easier to use. The parser also now calls separate pfutil
  1214.        functions that do the creation and configuration work. This
  1215.        will make it easier to create custom configuration routines.
  1216.  
  1217.        The configuration files now support relative pathnames.
  1218.        Cliptexture configuration files can now be created that
  1219.        don't need image cache configuration files.
  1220.  
  1221.  
  1222.        6.6.5.2  _A_c_t_i_v_e__S_u_r_f_a_c_e__D_e_f_i_n_i_t_i_o_n
  1223.  
  1224.        _l_i_b_p_f_s _n_o _l_o_n_g_e_r _e_x_i_s_t_s. You should make sure you no longer
  1225.        link with it. pfTerrain no longer exists either.  All
  1226.        PFTERRAIN_ tokens have been renamed PFASD_.  Aligning object
  1227.        to pfASD uses pfFlux and pfEngine.
  1228.  
  1229.  
  1230.            ppppffffAAAASSSSDDDDGGGGSSSSttttaaaatttteeee((((ppppffffAAAASSSSDDDD**** ____aaaassssdddd,,,, ppppffffGGGGeeeeooooSSSSttttaaaatttteeee ****ggggssss))))
  1231.  
  1232.        is now
  1233.  
  1234.  
  1235.            ppppffffAAAASSSSDDDDGGGGSSSSttttaaaatttteeeessss((((ppppffffAAAASSSSDDDD**** ____aaaassssdddd,,,, ppppffffGGGGeeeeooooSSSSttttaaaatttteeee ********ggggssss,,,, iiiinnnntttt nnnnuuuummmm))))
  1236.  
  1237.        It is important that when you port to this new api you use
  1238.        pfMalloc to allocate the array of pfGeoState pointers.
  1239.  
  1240.        So:
  1241.  
  1242.  
  1243.                ppppffffAAAASSSSDDDDGGGGSSSSttttaaaatttteeee((((aaaassssdddd,,,, ggggssss))));;;;
  1244.  
  1245.        Should become:
  1246.  
  1247.  
  1248.  
  1249.  
  1250.  
  1251.  
  1252.  
  1253.  
  1254.  
  1255.  
  1256.  
  1257.  
  1258.                                   - 20 -
  1259.  
  1260.  
  1261.  
  1262.                {{{{
  1263.                   ppppffffGGGGeeeeooooSSSSeeeetttt ********ggggssssssss;;;;
  1264.                   ggggssssssss ==== ((((ppppffffGGGGeeeeooooSSSSeeeetttt ********))))ppppffffMMMMaaaalllllllloooocccc((((ssssiiiizzzzeeeeooooffff((((ppppffffGGGGeeeeooooSSSSeeeetttt********))))****1111,,,,
  1265.                                ppppffffGGGGeeeettttSSSShhhhaaaarrrreeeeddddAAAArrrreeeennnnaaaa(((())))))));;;;
  1266.                   ggggssssssss[[[[0000]]]] ==== ggggssss;;;;
  1267.                   ppppffffAAAASSSSDDDDGGGGSSSSttttaaaatttteeeessss((((aaaassssdddd,,,, ggggssssssss,,,, 1111))));;;;
  1268.                }}}}
  1269.  
  1270.        PFTERRAIN constants have become PFASD constants pfs prefix
  1271.        has become pfASD pfsFace data structure has become pfASDFace
  1272.        and the field names have been changed to properly reflect
  1273.        the functionality.
  1274.  
  1275.        A current version of the Muligen loader is supplied to
  1276.        handle these changes
  1277.  
  1278.        New sample programs including examples of aligning features
  1279.        and moving objects to ASD geometry.
  1280.  
  1281.                /usr/share/Performer/src/pguide/libpf/C/ASD_align.c
  1282.  
  1283.        New sample program that demonstrates the pfASD data
  1284.        structure
  1285.  
  1286.                /usr/share/Performer/src/pguide/libpf/C++/simpleASD.C
  1287.  
  1288.  
  1289.        pfASD can be paged in as simle areal blocks, as handled by
  1290.        Multigen CAT feature.
  1291.  
  1292.        pfASD also supports a multi-resolution paging scheme, very
  1293.        similar to clipmap paging. An example of the construction of
  1294.        pfASD from a set of uniform elevation data  can be found in
  1295.  
  1296.                /usr/share/Performer/src/lib/libpfdu/pfdBuildASD.c
  1297.  
  1298.        Inside the same file, you can find routines that constructs
  1299.        paging ASD tiles from a fully built ASD structure. Please
  1300.        notice that the builder is for demonstration purposes
  1301.        mainly. The algorithm used is not sophisticated enough to
  1302.        provent terrain from visible morphing distortion during
  1303.        real-time fly through. The demo "yosemite" provided on 2.2
  1304.        demo CD is constructed using CAT feature in Multigen.
  1305.  
  1306.        Paging construction example can be found in
  1307.  
  1308.                /usr/share/Performer/src/pguide/libpf/C/buildarcinfo.c
  1309.                /usr/share/Performer/src/pguide/libpf/C/buildbw.c
  1310.                /usr/share/Performer/src/pguide/libpf/C/builddem.c
  1311.                /usr/share/Performer/src/pguide/libpf/C/builddted.c
  1312.  
  1313.  
  1314.  
  1315.  
  1316.  
  1317.  
  1318.  
  1319.  
  1320.  
  1321.  
  1322.  
  1323.  
  1324.                                   - 21 -
  1325.  
  1326.  
  1327.  
  1328.        Executing the command, e.g.
  1329.  
  1330.                buildbw elevation.bw bw/tile bw/config bw/page
  1331.  
  1332.        will put a set of paging tiles under the directory bw, with
  1333.        prefix "tile" as their file names. Once you decide on how
  1334.        many extra tiles to page on each LOD based on LODRange as
  1335.        well as the paging delay, you MUST process the tiles one
  1336.        more time into a fast paging binary format before feeding it
  1337.        into a paging pfASD node.
  1338.  
  1339.        The second pass paging data construction can be found in
  1340.  
  1341.                /usr/share/Performer/src/pguide/libpf/C/convasd.c
  1342.  
  1343.        For example,
  1344.  
  1345.                convasd bw/config bw/page
  1346.  
  1347.        will process the tiles.  The final step is to hand all the
  1348.        attributes defined in the config file and page file to pfASD
  1349.        by calling
  1350.  
  1351.                pfdLoadConfig(config, page);
  1352.  
  1353.  
  1354.  
  1355.        6.6.5.3  _O_p_e_n_G_L__V_e_r_t_e_x__A_r_r_a_y_s
  1356.  
  1357.        The OpenGL _V_e_r_t_e_x_A_r_r_a_y extension is supported by IRIS
  1358.        Performer as an optimized way to send formatted data to the
  1359.        graphics pipeline, reducing the host interface.
  1360.  
  1361.        Vertex arrays use a new pfGSetAttr list, PFGS_PACKED_ATTRS,
  1362.        that includes a separate copy of the vertex attribute data
  1363.        packed into a single non-indexed array.  Your vertex
  1364.        coordinates may optionally be in this packed array.  A
  1365.        sample program that demonstrates the use of vertex arrays on
  1366.        pfGeoSets is in:
  1367.  
  1368.                /usr/share/Performer/src/pguide/libpr/packedattrs.c
  1369.  
  1370.        Additionally, there is a utility traversal,
  1371.        pfuTravCreateVertArrays, that will traverse the scene graph
  1372.        and create vertex arrays for the pfGeoSets and optionally
  1373.        pfDelete the other redundant attribute arrays.  The utility
  1374.        routines used by this traversal to actually pack the
  1375.        pfGeoSet data is  pfuFillGSetVertArray().  This traversal
  1376.        can be invoked on the Perfly sample application with the -v
  1377.        # option where # is 1 or 2 to select one of two packed
  1378.        formats of with or without the vertices copied into the
  1379.  
  1380.  
  1381.  
  1382.  
  1383.  
  1384.  
  1385.  
  1386.  
  1387.  
  1388.  
  1389.  
  1390.                                   - 22 -
  1391.  
  1392.  
  1393.  
  1394.        vertex array, respectively.
  1395.  
  1396.  
  1397.        6.6.5.4  _O_p_e_n_G_L__s_p_l_i_n_e__F_o_g
  1398.  
  1399.        InfiniteReality supports the specification of a fog function
  1400.        so Spline Fog support for OpenGL has been added to IRIS
  1401.        Performer and will be available on machines that support it.
  1402.  
  1403.  
  1404.        6.6.5.5  _T_F_a_n_s
  1405.  
  1406.        IRIS Performer 2.2 supports Triangle Fans in a pfGeoSets
  1407.        when using OpenGL
  1408.  
  1409.  
  1410.        6.6.5.6  _A_s_y_n_c_h_r_o_n_o_u_s__D_y_n_a_m_i_c__D_a_t_a
  1411.  
  1412.        IRIS Performer 2.2 supports truly asynchronous dynamic data
  1413.        with _p_f_F_l_u_x.  Data for geometry attributes in pfGeoSets and
  1414.        fields in various pfNodes can be computed in fully
  1415.        asynchronous processes and store in a pfFlux buffer.  pfFlux
  1416.        will manage the the hookup, data exclusion, and frame
  1417.        management accurate book-keeping.  pfFluxes can be
  1418.        explicitly driven by _p_f_E_n_g_i_n_e_s for defining the functions
  1419.        that generate the dynamic data.
  1420.  
  1421.        pfGeoSets themselves can be fluxed and fluxed pfGeoSets can
  1422.        be given to a pfGeode directly.
  1423.  
  1424.        pfEngines can be used to control the data in a flux. A
  1425.        complete graph of pfEngines and pfFlux can be done to
  1426.        control the dynamic behavior of a database. Both pfEngines
  1427.        and pfFluxes are stored in the performer binary file format
  1428.        (pfb), even external functions used by pfEngines can be
  1429.        registers into the pfb and the right DSO will automatically
  1430.        be loaded when the pfb file will be used in Performer.
  1431.  
  1432.  
  1433.        6.6.5.7  _L_i_g_h_t__P_o_i_n_t
  1434.  
  1435.        A new light point process can be forked off and use a cpu to
  1436.        do the _p_f_L_P_o_i_n_t_S_t_a_t_e computation instead of taking time of
  1437.        the Draw Process.  The light point process is synchronous to
  1438.        the Draw process, and also support Calligraphic Light points
  1439.        when the Calligraphic Board and Projector are hooked to the
  1440.        system. To learn more about raster and calligraphic lights
  1441.        see the pfLPointState and _p_f_C_a_l_l_i_g_r_a_p_h_i_c man pages, as well
  1442.        as the pfChannel man pages to see how the light point
  1443.        process works.
  1444.  
  1445.  
  1446.  
  1447.  
  1448.  
  1449.  
  1450.  
  1451.  
  1452.  
  1453.  
  1454.  
  1455.  
  1456.                                   - 23 -
  1457.  
  1458.  
  1459.  
  1460.        6.6.5.8  _N_e_w__l_o_a_d_e_r_s
  1461.  
  1462.           +o Loaders for creating pfASD structures from elevation
  1463.             data are now include in IRIS Performer 2.2
  1464.             _l_i_b_p_f_d_b/_l_i_b_p_f_d_e_m - This loader handles a variety of the
  1465.             USGS DEM elevation data products, including the common
  1466.             7.5 minute (1:24,000) and 1 degree (1:250,000) DEM
  1467.             files.  _l_i_b_p_f_d_b/_l_i_b_p_f_d_t_e_d - This loader handles DMA
  1468.             DTED Level 1 and 2 elevation data products.
  1469.             _l_i_b_p_f_d_b/_l_i_b_p_f_a_r_c_i_n_f_o - This loader handles elevation
  1470.             data files in the simple ARC/INFO ASCII GRID export
  1471.             format.  _l_i_b_p_f_d_b/_l_i_b_p_f_e_v_t - This loader reads data in
  1472.             the temporary ".evt" binary format.
  1473.             The loaders read the elevation data from the file and
  1474.             construct an appropriate pfASD node structure.  The
  1475.             origin coordinates of the created pfASD node will be
  1476.             set to the southwest corner, zero altitude point of the
  1477.             elevation data area.  The data will be oriented in the
  1478.             XY plane for elevation data specified in planar
  1479.             coordinates (such as UTM), or oriented properly on the
  1480.             earth ellipsoid for data specified in geodetic
  1481.             coordinates (Z-axis towards North Pole, X-axis defined
  1482.             by the intersection of the prime meridian and
  1483.             equatorial planes).  Use pfdBuildASD to indicate the
  1484.             levels of detail you wish to build.  That is the last
  1485.             parameter in pfdBuildASD().
  1486.  
  1487.             The function "libpfdu/pfdBuildASD()" can be used to
  1488.             construct pfASD structures for elevation data not
  1489.             handled by the above loaders.  There are support for
  1490.             building paging tiles in pfdBuildASD(). It is not
  1491.             turned on by default. Set the PAGING constant in
  1492.             pfdBuildASD.c to 1 if you want to experiment with
  1493.             paging pfASD tiles.
  1494.  
  1495.  
  1496.           +o A VRML 2.0 loader is included. This loader is a gift
  1497.             from DrAW Computing Associates and will successfully
  1498.             the geometry and texture of many VRML2.0 files. To have
  1499.             more VRML 2.0 support, such as Routes, JAVA,
  1500.             saveToVrml, html direct access from performer, or to
  1501.             report any problem with the VRML 2.0 loader you will
  1502.             have to contact them directly at info@openworlds.com.
  1503.             See the demos under openworlds in the Friend of
  1504.             Performer 2.2 CD.  Note that VRML 1.0 files are not
  1505.             supported by this loader. Previously the case, so you
  1506.             have either to convert your VRML1.0 files to VRML2.0,
  1507.             or to explicitly name your files .iv so the inventor
  1508.             loader will be used in place of the VRML 2.0 loader.
  1509.  
  1510.  
  1511.  
  1512.  
  1513.  
  1514.  
  1515.  
  1516.  
  1517.  
  1518.  
  1519.  
  1520.  
  1521.  
  1522.                                   - 24 -
  1523.  
  1524.  
  1525.  
  1526.           +o A OpenGL Optimizer binary file loader (csb) is part of
  1527.             IRIS Performer 2.2 distribution. This allow exchange of
  1528.             files in between the two products as OpenGL Optimizer
  1529.             reads IRIS Performer binary files (pfb). Note that the
  1530.             pfb loader for Optimizer has a problem that changes all
  1531.             opaque polygons to fully transparent and vice-versa.
  1532.             This will be fixed, and a new pfb loader for OpenGL
  1533.             Optimizer will be available on the Web. (see section 4
  1534.             of release note)
  1535.  
  1536.  
  1537.  
  1538.        6.6.5.9  _C_o_p_l_a_n_a_r__g_e_o_m_e_t_r_y
  1539.  
  1540.        Layer and Decal geometry may now use the new OpenGL
  1541.        reference plane.  Reference planes may be specified on
  1542.        pfGeoSets, pfGeoStates, and in the global state.  See the
  1543.        pfGeoSet and pfDecal, and pfGeoState reference pages for
  1544.        more information.
  1545.  
  1546.  
  1547.        6.6.5.10  _T_e_x_t_u_r_e__m_a_t_r_i_c_e_s
  1548.        Texture matrices may now be specified on pfGeoStates.  See
  1549.        the pfGeoState reference page for more information.
  1550.  
  1551.  
  1552.        6.6.5.11  _T_r_a_v_e_r_s_a_l_s
  1553.        libpfutil traversal, pfuTravCompileDList, traversal for
  1554.        traversing an entire scene graph and creating display lists
  1555.        for all pfGeoSets.  This is to be used in combination with
  1556.        pfuTravDListDraw and is useful for compiling and pre-
  1557.        downloading display lists on InfiniteReality.
  1558.  
  1559.  
  1560.        6.6.5.12  _V_i_d_e_o__t_e_x_t_u_r_i_n_g
  1561.  
  1562.        There is one main sample program for video texturing:
  1563.  
  1564.           /usr/share/Performer/src/pguide/libpf/C/movietex.c
  1565.  
  1566.        a multiprocessing example.  Note that all video
  1567.        initialization, including the creation of video library
  1568.        resources, is done in the draw process, as required by the
  1569.        video library. The program has #define switches for
  1570.        compilation on IRIX 6.2 or IRIX 6.5 and supports DIVO,
  1571.        Sirius, OCTANE, and O2 video options.  Movitex.c uses
  1572.        features added in Performer 2.2: special pfTexture LOAD
  1573.        source parameters for specifying dmedia buffers or the video
  1574.        library server, path and drain, as well as the texture
  1575.        matrix that can be specified on a pfGeoState with the
  1576.        PFSTATE_TEXMAT attribute for transforming texture
  1577.  
  1578.  
  1579.  
  1580.  
  1581.  
  1582.  
  1583.  
  1584.  
  1585.  
  1586.  
  1587.  
  1588.                                   - 25 -
  1589.  
  1590.  
  1591.  
  1592.        coordinates int the proper area of a texture receiving video
  1593.        input.
  1594.  
  1595.        An old Sirius example has been retained in
  1596.        /usr/share/Performer/src/pguide/libpr/C/siriusvidtex.c.
  1597.  
  1598.  
  1599.        6.6.5.13  _T_e_x_t_u_r_e__L_O_D__o_b_j_e_c_t
  1600.  
  1601.        New pfTexLOD object for controlling LOD of textures.
  1602.        pfTexLOD is a new state attribute used to control the use of
  1603.        levels of detail of a pfTexture.  The levels of detail
  1604.        accessed can be limited by setting the LOD range and the
  1605.        computation of the current LOD value can be biased.  These
  1606.        controls are useful in conjunction with dynamic texture
  1607.        loading where the accessed levels can be limited to the
  1608.        valid levels and for artificially blurring or sharpening a
  1609.        texture.
  1610.  
  1611.  
  1612.        6.6.5.14  _N_e_w__f_a_s_t__i_m_a_g_e__f_i_l_e__f_o_r_m_a_t
  1613.  
  1614.        There is now the pfi fast image file loader to complement
  1615.        pfb.  pfi files are hardware-ready fast loading image files
  1616.        that may contain MIPmaps for textures and multiple complete
  1617.        textures.
  1618.  
  1619.        /usr/share/Performer/src/sample/pfconv.c
  1620.  
  1621.        can convert a database to use pfi files for its textures. In
  1622.        addition, there is a
  1623.  
  1624.        /usr/share/Performer/src/sample/pficonv.c
  1625.  
  1626.        for converting .rgb files to pfi files and generating
  1627.        MIPmaps.  Look at the data/town/town_ogl_pfi.pfb database.
  1628.  
  1629.  
  1630.        6.6.5.15  _p_f_C_h_a_n_n_e_l
  1631.        Here are the additional C++ member functions added in
  1632.        Performer 2.2 to those already provided in IRIS Performer
  1633.        2.1 for the pfChannel class. Each C++ function has a
  1634.        corresponding C function, and all are fully described in the
  1635.        IRIS Performer 2.2 C and C++ Reference Pages.
  1636.  
  1637.  
  1638.            ggggeeeettttFFFFrrrraaaammmmeeeePPPPVVVVCCCChhhhaaaannnn
  1639.            sssseeeettttOOOOuuuuttttppppuuuuttttVVVViiiieeeewwwwppppoooorrrrtttt
  1640.            sssseeeettttCCCCaaaalllllllliiiiggggEEEEnnnnaaaabbbblllleeee
  1641.            ggggeeeettttCCCCaaaalllllllliiiiggggEEEEnnnnaaaabbbblllleeee
  1642.            sssseeeettttCCCCaaaalllllllliiiigggg
  1643.  
  1644.  
  1645.  
  1646.  
  1647.  
  1648.  
  1649.  
  1650.  
  1651.  
  1652.  
  1653.  
  1654.                                   - 26 -
  1655.  
  1656.  
  1657.  
  1658.            ggggeeeettttCCCCaaaalllllllliiiigggg
  1659.            ggggeeeettttCCCCuuuurrrrCCCCaaaalllllllliiiigggg
  1660.            ggggeeeettttFFFFrrrreeeeeeeeBBBBiiiinnnn
  1661.            AAAASSSSDDDDAAAAttttttttaaaacccchhhh
  1662.            AAAASSSSDDDDddddeeeettttaaaacccchhhh
  1663.  
  1664.        6.6.5.16  _p_f_D_i_s_p_L_i_s_t
  1665.  
  1666.        This is the additional C++ member function added in
  1667.        Performer 2.2 to those already provided in IRIS Performer
  1668.        2.1 for the pfDispList class. This function allows the
  1669.        contents of one IRIS Performer pfDispList to be appended to
  1670.        a second pfDispList, supporting the merge of independent
  1671.        pfDispLists.  The _p_f_D_i_s_p_L_i_s_t::_a_p_p_e_n_d C++ function has a
  1672.        corresponding C function (_p_f_A_p_p_e_n_d_D_L_i_s_t), and both are fully
  1673.        described in the IRIS Performer 2.2 C and C++ Reference
  1674.        Pages.
  1675.  
  1676.  
  1677.            ggggeeeettttGGGGLLLLHHHHaaaannnnddddlllleeee
  1678.            sssseeeettttMMMMooooddddeeee
  1679.            ccccoooommmmppppiiiilllleeee
  1680.            pppprrrreeeepppprrrroooocccceeeessssssss
  1681.  
  1682.        6.6.5.17  _p_f_Q_u_e_u_e
  1683.  
  1684.        Here are the additional C++ member functions added in
  1685.        Performer 2.2 to those already provided in IRIS Performer
  1686.        2.1 for the pfQueue class.  These new functions add support
  1687.        for having a sort process that will sort the items in the
  1688.        queue.  Each C++ function has a corresponding C function,
  1689.        and all are fully described in the IRIS Performer 2.2 C and
  1690.        C++ Reference Pages.
  1691.  
  1692.  
  1693.            ggggeeeettttEEEElllleeeemmmmeeeennnnttttSSSSiiiizzzzeeee
  1694.            sssseeeettttSSSSoooorrrrttttFFFFuuuunnnncccc
  1695.            ggggeeeettttSSSSoooorrrrttttFFFFuuuunnnncccc
  1696.            ggggeeeettttSSSSoooorrrrttttMMMMooooddddeeee
  1697.            sssseeeettttIIIInnnnppppuuuuttttRRRRaaaannnnggggeeee
  1698.            ggggeeeettttIIIInnnnppppuuuuttttRRRRaaaannnnggggeeee
  1699.            ggggeeeettttOOOOuuuuttttppppuuuuttttRRRRaaaannnnggggeeee
  1700.            ggggeeeettttSSSSoooorrrrttttPPPPrrrrooooccccPPPPIIIIDDDD
  1701.            iiiinnnnsssseeeerrrrttttFFFFrrrroooonnnntttt
  1702.            aaaatttttttteeeemmmmppppttttRRRReeeemmmmoooovvvveeee
  1703.            ssssiiiiggggnnnnaaaallllAAAAllllllllSSSSeeeerrrrvvvviiiicccceeeePPPPrrrrooooccccssss
  1704.            nnnnoooottttiiiiffffyyyySSSSoooorrrrttttPPPPrrrroooocccc
  1705.  
  1706.        6.6.5.18  _p_f_I_m_a_g_e_T_i_l_e
  1707.  
  1708.        Here are the additional C++ member functions added in
  1709.  
  1710.  
  1711.  
  1712.  
  1713.  
  1714.  
  1715.  
  1716.  
  1717.  
  1718.  
  1719.  
  1720.                                   - 27 -
  1721.  
  1722.  
  1723.  
  1724.        Performer 2.2 to those already provided in IRIS Performer
  1725.        2.1 for the pfQueue class.  Each C++ function has a
  1726.        corresponding C function, and all are fully described in the
  1727.        IRIS Performer 2.2 C and C++ Reference Pages.
  1728.  
  1729.  
  1730.           sssseeeettttMMMMeeeemmmmQQQQuuuueeeeuuuueeee
  1731.           ggggeeeettttMMMMeeeemmmmQQQQuuuueeeeuuuueeee
  1732.           iiiissssLLLLooooaaaaddddiiiinnnngggg
  1733.           sssseeeettttPPPPrrrriiiioooorrrriiiittttyyyy
  1734.           ggggeeeettttPPPPrrrriiiioooorrrriiiittttyyyy
  1735.           sssseeeettttIIIImmmmaaaaggggeeeeCCCCaaaacccchhhheeee
  1736.           ggggeeeettttIIIImmmmaaaaggggeeeeCCCCaaaacccchhhheeee
  1737.           sssseeeettttTTTTiiiilllleeeeIIIInnnnddddeeeexxxx
  1738.           ggggeeeettttTTTTiiiilllleeeeIIIInnnnddddeeeexxxx
  1739.           sssseeeettttFFFFiiiilllleeeeNNNNaaaammmmeeeeFFFFuuuunnnncccc
  1740.           ggggeeeettttFFFFiiiilllleeeeNNNNaaaammmmeeeeFFFFuuuunnnncccc
  1741.           RRRReeeeaaaaddddDDDDiiiirrrreeeecccctttt
  1742.           RRRReeeeaaaaddddNNNNoooorrrrmmmmaaaallll
  1743.  
  1744.        6.6.5.19  _p_f_C_l_i_p_T_e_x_t_u_r_e
  1745.  
  1746.        Here are the additional C++ member functions added in
  1747.        Performer 2.2 to those already provided in IRIS Performer
  1748.        2.1 for the pfQueue class.  New functions deal with DTR,
  1749.        which is a tight control on how much time you want to
  1750.        allocate in the DrawProcess to dynamically load the texture
  1751.        versus drawing polygons, and control of Virtual (bigger)
  1752.        clip textures.  Each C++ function has a corresponding C
  1753.        function, and all are fully described in the IRIS Performer
  1754.        2.2 C and C++ Reference Pages.
  1755.  
  1756.  
  1757.            ggggeeeettttCCCCuuuurrrrCCCCeeeennnntttteeeerrrr
  1758.            sssseeeettttVVVViiiirrrrttttuuuuaaaallllLLLLOOOODDDDOOOOffffffffsssseeeetttt
  1759.            ggggeeeettttVVVViiiirrrrttttuuuuaaaallllLLLLOOOODDDDOOOOffffffffsssseeeetttt
  1760.            sssseeeettttNNNNuuuummmmEEEEffffffffeeeeccccttttiiiivvvveeeeLLLLeeeevvvveeeellllssss
  1761.            ggggeeeettttNNNNuuuummmmEEEEffffffffeeeeccccttttiiiivvvveeeeLLLLeeeevvvveeeellllssss
  1762.            sssseeeettttNNNNuuuummmmAAAAllllllllooooccccaaaatttteeeeddddLLLLeeeevvvveeeellllssss
  1763.            ggggeeeettttNNNNuuuummmmAAAAllllllllooooccccaaaatttteeeeddddLLLLeeeevvvveeeellllssss
  1764.            ggggeeeettttOOOOffffffffsssseeeetttt
  1765.            sssseeeettttTTTTeeeexxxxLLLLooooaaaaddddTTTTiiiimmmmeeee
  1766.            ggggeeeettttTTTTeeeexxxxLLLLooooaaaaddddTTTTiiiimmmmeeee
  1767.            sssseeeettttMMMMaaaasssstttteeeerrrr
  1768.            ggggeeeettttMMMMaaaasssstttteeeerrrr
  1769.            ggggeeeettttSSSSllllaaaavvvveeee
  1770.            sssseeeettttMMMMiiiinnnnCCCClllliiiippppSSSSiiiizzzzeeeeRRRRaaaattttiiiioooo
  1771.            ggggeeeettttMMMMiiiinnnnCCCClllliiiippppSSSSiiiizzzzeeeeRRRRaaaattttiiiioooo
  1772.            sssseeeettttDDDDTTTTRRRRMMMMooooddddeeee
  1773.            ggggeeeettttDDDDTTTTRRRRMMMMooooddddeeee
  1774.            ggggeeeettttMMMMiiiinnnnDDDDTTTTRRRRLLLLOOOODDDD
  1775.  
  1776.  
  1777.  
  1778.  
  1779.  
  1780.  
  1781.  
  1782.  
  1783.  
  1784.  
  1785.  
  1786.                                   - 28 -
  1787.  
  1788.  
  1789.  
  1790.            ggggeeeettttDDDDTTTTRRRRFFFFaaaaddddeeeeCCCCoooouuuunnnntttt
  1791.            sssseeeettttDDDDTTTTRRRRBBBBlllluuuurrrrMMMMaaaarrrrggggiiiinnnn
  1792.            ggggeeeettttDDDDTTTTRRRRBBBBlllluuuurrrrMMMMaaaarrrrggggiiiinnnn
  1793.            sssseeeettttNNNNuuuummmmEEEEffffffffeeeeccccttttiiiivvvveeeeLLLLeeeevvvveeeellllssssLLLLiiiimmmmiiiitttt
  1794.            ggggeeeettttNNNNuuuummmmEEEEffffffffeeeeccccttttiiiivvvveeeeLLLLeeeevvvveeeellllssssLLLLiiiimmmmiiiitttt
  1795.            sssseeeettttMMMMiiiinnnnLLLLOOOODDDDLLLLiiiimmmmiiiitttt
  1796.            ggggeeeettttMMMMiiiinnnnLLLLOOOODDDDLLLLiiiimmmmiiiitttt
  1797.            sssseeeettttLLLLOOOODDDDBBBBiiiiaaaassssLLLLiiiimmmmiiiitttt
  1798.            ggggeeeettttLLLLOOOODDDDBBBBiiiiaaaassssLLLLiiiimmmmiiiitttt
  1799.            sssseeeettttLLLLOOOODDDDRRRRaaaannnnggggeeee
  1800.            ggggeeeettttLLLLOOOODDDDRRRRaaaannnnggggeeee
  1801.            ggggeeeettttCCCCuuuurrrrLLLLOOOODDDDRRRRaaaannnnggggeeee
  1802.            sssseeeettttLLLLOOOODDDDBBBBiiiiaaaassss
  1803.            ggggeeeettttLLLLOOOODDDDBBBBiiiiaaaassss
  1804.            ggggeeeettttCCCCiiiirrrrLLLLOOOODDDDBBBBiiiiaaaassss
  1805.            aaaappppppppllllyyyyMMMMeeeemmmmRRRReeeegggg
  1806.            aaaappppppppllllyyyyTTTTeeeexxxxRRRReeeegggg
  1807.            uuuuppppddddaaaatttteeeeMMMMeeeemmmmTTTTeeeegggg
  1808.            uuuuppppddddaaaatttteeeeTTTTeeeexxxxRRRReeeegggg
  1809.            uuuuppppddddaaaatttteeee
  1810.            iiiinnnnvvvvaaaalllliiiiddddaaaatttteeee
  1811.            aaaappppppppllllyyyyVVVViiiirrrrttttuuuuaaaallllPPPPaaaarrrraaaammmmssss
  1812.            aaaappppppppllllyyyyCCCCeeeennnntttteeeerrrr
  1813.            iiiissssVVVViiiirrrrttttuuuuaaaallll
  1814.  
  1815.        6.7  _D_i_f_f_e_r_e_n_c_e_s _b_e_t_w_e_e_n _I_R_I_S _P_e_r_f_o_r_m_e_r _2._0 _a_n_d _p_r_e_v_i_o_u_s
  1816.             _r_e_l_e_a_s_e_s
  1817.  
  1818.        This section elucidates the changes and enhancements between
  1819.        the prior IRIS Performer 2.0 release and the even older IRIS
  1820.        Performer 1.2 release. Since all the 2.0 features are
  1821.        included in 2.2 this concerns porting from 1.2 to 2.2 as
  1822.        well.
  1823.  
  1824.        If you are new to IRIS Performer or if you have already
  1825.        converted your applications to the more recent 2.0 release
  1826.        you can skip this section, since the information contained
  1827.        here is provided merely to ease porting efforts for older
  1828.        applications. These features are also described in the the
  1829.        IRIS Performer Programming Guide.
  1830.  
  1831.  
  1832.        6.7.1  _N_e_w__F_e_a_t_u_r_e_s
  1833.  
  1834.        6.7.1.1  _S_u_p_p_o_r_t__f_o_r__O_p_e_n_G_L
  1835.        Performer 2.0 includes separate sets of libraries for
  1836.        supporting IRIS GL or OpenGL interfaces. These libraries
  1837.        have GL-dependent suffixes to indicate their type: IRIS
  1838.        GL=_igl and OpenGL=_ogl
  1839.  
  1840.            IIIIRRRRIIIISSSS GGGGLLLL:::: lllliiiibbbbppppffff____iiiiggggllll....ssssoooo
  1841.  
  1842.  
  1843.  
  1844.  
  1845.  
  1846.  
  1847.  
  1848.  
  1849.  
  1850.  
  1851.  
  1852.                                   - 29 -
  1853.  
  1854.  
  1855.  
  1856.            OOOOppppeeeennnnGGGGLLLL:::: lllliiiibbbbppppffff____ooooggggllll....ssssoooo
  1857.  
  1858.        Porting an IRIS Performer application from IRIS GL to OpenGL
  1859.        should require very little work.  There are a couple of
  1860.        isolated routine changes (see API changes below).  The main
  1861.        work will be in porting an application IRIS GL code in user
  1862.        draw callbacks and in porting the windowing and event
  1863.        handling to X.  For porting windowing code, pfWindows and
  1864.        pfPipeWindows (libpr and libpf, respectively) provide a GL
  1865.        independent windowing environment.  Libpfutil provides GL-
  1866.        input handling utilities for libpf applications using
  1867.        pfPipeWindows (pfuInitInput()).  The sample programs
  1868.        installed in
  1869.  
  1870.            ////uuuussssrrrr////sssshhhhaaaarrrreeee////PPPPeeeerrrrffffoooorrrrmmmmeeeerrrr////ssssrrrrcccc////ppppgggguuuuiiiiddddeeee////{{{{lllliiiibbbbpppprrrr,,,,lllliiiibbbbppppffff}}}}////pppprrrrooooggggssss
  1871.  
  1872.        also demonstrate comparative X vs GL input handling.
  1873.  
  1874.        When compiling for IRIS GL, use '-DIRISGL' on the command
  1875.        line to include the IRIS GL versions of the Performer header
  1876.        files.
  1877.  
  1878.  
  1879.        6.7.1.2  _6_4_-_b_i_t__a_d_d_r_e_s_s__s_p_a_c_e__s_u_p_p_o_r_t
  1880.  
  1881.        6.7.1.3  _P_e_r_f_o_r_m_e_r__E_n_v_i_r_o_n_m_e_n_t__V_a_r_i_a_b_l_e_s__a_n_d__D_S_O_s
  1882.        Performer now robustly supports the notion of separate run-
  1883.        time file loaders as DSO's (Dynamic Shared Objects).  Thus,
  1884.        the generic utility method for opening a file now differs
  1885.        considerably - the extension of the filename is used to
  1886.        determine the name of shared object to load as well as the
  1887.        function within that shared library to call.  Two new
  1888.        environment variables exist to help locate these dynamic
  1889.        shared object libraries at run-time:
  1890.  
  1891.           +o PFLD_LIBRARY_PATH Specifies a colon separated list of
  1892.             directories where Performer should look for dynamic
  1893.             objects...
  1894.  
  1895.           +o PFHOME Specifies the root Performer directory (the root
  1896.             used to install Performer).  This is used such that
  1897.             various code in the libraries can look relative to this
  1898.             top level such as $PFHOME/usr/lib/libpfdb might be a
  1899.             location where dso's would live.  In this way a
  1900.             consistent tree structure might be maintained
  1901.             regardless of Performers PFHOME directory.  (This is
  1902.             useful when using Performer installed on another
  1903.             automounted machine for instance - setenv PFHOME
  1904.             /hosts/remote_machine/)
  1905.  
  1906.  
  1907.  
  1908.  
  1909.  
  1910.  
  1911.  
  1912.  
  1913.  
  1914.  
  1915.  
  1916.  
  1917.  
  1918.                                   - 30 -
  1919.  
  1920.  
  1921.  
  1922.        6.7.1.4  _C_+_+__A_P_I
  1923.        When compiling programs using Performer's C++ API, you need
  1924.        to directly include the class header files from
  1925.  
  1926.            ////uuuussssrrrr////iiiinnnncccclllluuuuddddeeee////PPPPeeeerrrrffffoooorrrrmmmmeeeerrrr////pppprrrr
  1927.  
  1928.        and
  1929.  
  1930.            ////uuuussssrrrr////iiiinnnncccclllluuuuddddeeee////PPPPeeeerrrrffffoooorrrrmmmmeeeerrrr////ppppffff....
  1931.  
  1932.        6.7.1.5  _C_o_m_p_i_l_i_n_g _P_e_r_f_o_r_m_e_r _1._2 _C++ _a_p_p_l_i_c_a_t_i_o_n_s _w_i_t_h
  1933.        _P_e_r_f_o_r_m_e_r _2._0   With Performer 2.0, compiling a Performer
  1934.        application with the C++ compiler enables the use of C++
  1935.        classes for Performer types.  Some of these Performer types
  1936.        (pfMatrix, pfVec2, pfVec3, pfVec4, pfQuat) are typedefed
  1937.        arrays when compiling with C and classes when compiling with
  1938.        C++.  Because typedefed arrays and classes differ in their
  1939.        usage, Performer applications written C++ using Performer
  1940.        1.2's C API may not compile under C++ unless Performer is
  1941.        told to revert to C types when compiling under C++.
  1942.  
  1943.        If you wish to compile existing C++ code using Performer C
  1944.        types add the line
  1945.  
  1946.            ''''####ddddeeeeffffiiiinnnneeee PPPPFFFF____CCCCPPPPLLLLUUUUSSSSPPPPLLLLUUUUSSSS____AAAAPPPPIIII 0000''''
  1947.  
  1948.        before including any Performer header files.  Note that the
  1949.        use of C types precludes the use of Performer's C++ API.
  1950.  
  1951.  
  1952.        6.7.1.6  _M_i_x_i_n_g__C_+_+__A_P_I__a_n_d__C__A_P_I__i_n__a__S_i_n_g_l_e__A_p_p_l_i_c_a_t_i_o_n
  1953.  
  1954.        Normally, when compiling under C++, the C API routines
  1955.        corresponding to member functions on a class are not exposed
  1956.        in the header files.  Applications wishing to taste the
  1957.        combined smorgasbord of both APIs should add the line
  1958.  
  1959.            ''''####ddddeeeeffffiiiinnnneeee PPPPFFFF____CCCC____AAAAPPPPIIII 1111
  1960.  
  1961.        before including any Performer header files.
  1962.  
  1963.  
  1964.        6.7.2  _L_I_B_P_R__E_n_h_a_n_c_e_m_e_n_t_s
  1965.  
  1966.        6.7.2.1  _p_f_G_e_o_S_e_t
  1967.        PFGS_POLYS for N-sided, convex polygons. Specify the number
  1968.        of sides of each polygon with pfGSetPrimLengths().
  1969.  
  1970.        pfGSetPassFilter() sets a filter which allows only specific
  1971.        pfGeoSets to be drawn, e.g., a
  1972.  
  1973.  
  1974.  
  1975.  
  1976.  
  1977.  
  1978.  
  1979.  
  1980.  
  1981.  
  1982.  
  1983.  
  1984.                                   - 31 -
  1985.  
  1986.  
  1987.  
  1988.            PPPPFFFFGGGGSSSS____NNNNOOOONNNNTTTTEEEEXXXX____GGGGSSSSEEEETTTT |||| PPPPFFFFGGGGSSSS____EEEEMMMMIIIISSSSSSSSIIIIVVVVEEEE____GGGGSSSSEEEETTTT
  1989.  
  1990.        filter will draw only non-textured, emissive pfGeoSets.
  1991.  
  1992.        pfGetGSetAttrRange() returns the number of attributes (e.g.,
  1993.        coordinates) accessed by non-indexed a pfGeoSet and the
  1994.        maximum range of indexes if the pfGeoSet is indexed.
  1995.  
  1996.        pfGeoSets can now index their pfGeoStates through a global
  1997.        table set by pfApplyGStateTable(). pfGSetGStateIndex() sets
  1998.        the value which is used to index the global table. Indexed
  1999.        pfGeoStates in conjunction with different pfGeoState tables
  2000.        allow drastically different appearances of a single database
  2001.        without duplicating geometry or the scene graph.  For
  2002.        example, a visual and infrared version of a database is
  2003.        easily supported with 2 different pfGeoState tables.
  2004.  
  2005.        pfGeoSets now accept pfCycleBuffer* as attribute lists to
  2006.        support dynamic attribute changes in a pipelined,
  2007.        multiprocessing environment.  pfCycleBuffers automatically
  2008.        manage multiple data buffers to avoid data collisions and
  2009.        ensure frame-accurate behavior of attribute changes.  This
  2010.        greatly simplifies modification of coordinates for
  2011.        sophisticated facial and skeletal animation, geometrically
  2012.        morphed level-of-detail, and special effects such as
  2013.        explosions.  Note that pfCycleBuffer nodes are obsolete with
  2014.        IRIS Performer 2.2 and that pfFlux should be used instead of
  2015.        pfCycleBuffer.
  2016.  
  2017.  
  2018.        6.7.2.2  _p_f_G_e_o_S_t_a_t_e
  2019.        pfGStateFuncs() allow pre and post callbacks on a per-
  2020.        pfGeoState basis.  The pre callback is invoked after the GL
  2021.        has been configured with the pfGeoState's state and the post
  2022.        callback is lazily invoked by the next pfGeoState
  2023.        application so the pre/post callbacks nicely bracket
  2024.        pfDrawGSet().
  2025.  
  2026.        pfGStateVal() is added for floating point values and now
  2027.        accepts PFSTATE_ALPHAREF.
  2028.  
  2029.        pfGeoSets can now index pfGeoStates (pfGSetGStateIndex())
  2030.        through pfGeoState global tables (pfApplyGStateTable()) or
  2031.        pfGeoState tables assigned to a pfChannel
  2032.        (pfChanGStateTable()) .
  2033.  
  2034.  
  2035.        6.7.2.3  _p_f_F_o_g
  2036.        pfGetFogDensity returns the density of a pfFog at a given
  2037.        range.
  2038.  
  2039.  
  2040.  
  2041.  
  2042.  
  2043.  
  2044.  
  2045.  
  2046.  
  2047.  
  2048.  
  2049.  
  2050.                                   - 32 -
  2051.  
  2052.  
  2053.  
  2054.        6.7.2.4  _p_f_L_P_o_i_n_t_S_t_a_t_e
  2055.        A new PFSTATE attribute, pfLPointState causes pfGeoSets of
  2056.        type PFGS_POINTS to be rendered as "light points", e.g.,
  2057.        runway lights, stars. Light points have perspective size
  2058.        based on range and many other features. This is a major
  2059.        enhancement and is discussed in great detail in the
  2060.        pfLPointState man page.
  2061.  
  2062.  
  2063.        6.7.2.5  _p_f_S_p_r_i_t_e
  2064.        A new kind of transform, pfSprite automatically rotates
  2065.        pfGeoSets and plain GL geometry to face the viewer.
  2066.        Different rotational constraints are possible including:
  2067.        rotate about an axis, rotate about a point.
  2068.  
  2069.  
  2070.        6.7.2.6  _p_f_T_e_x_G_e_n
  2071.        A new PFSTATE attribute, pfTexGen encapsulates the GL's
  2072.        texgen() feature which automatically generates texture
  2073.        coordinates. The Wavefront OBJ file loader in libpfdb
  2074.        provides an example of the use of this new capability. Refer
  2075.        to that source code for usage examples.
  2076.  
  2077.  
  2078.        6.7.2.7  _p_f_T_r_a_n_s_p_a_r_e_n_c_y
  2079.        pfTransparency now supports PFTR_MS_ALPHA_MASK which enables
  2080.        multisample transparency but also writes the true alpha
  2081.        value into the frame buffer instead of fully opaque alpha
  2082.        values as PFTR_MS_ALPHA does.
  2083.  
  2084.  
  2085.        6.7.2.8  _p_f_D_e_c_a_l
  2086.        When using DISPLACE type decals, LAYERS are no longer
  2087.        required to be rendered immediately after their BASES - they
  2088.        can be drawn in any order. This introduces new LAYER-
  2089.        specific tokens:  PFDECAL_LAYER_FAST, PFDECAL_LAYER_DISPLACE
  2090.        and requires specific identification of all layers after the
  2091.        first since each layer must be displaced slightly more than
  2092.        its predecessor.  The tokens PFDECAL_LAYER_1 ->
  2093.        PFDECAL_LAYER_7 are provided for layer identification.
  2094.  
  2095.  
  2096.        6.7.2.9  _p_f_C_y_c_l_e_B_u_f_f_e_r_/_p_f_C_y_c_l_e_M_e_m_o_r_y
  2097.  
  2098.        Note that pfCycleBuffer is obsolete with IRIS Performer2.2
  2099.        in favor of the pfFlux. IRIS Performer 2.0/2.1 pfCycleBuffer
  2100.        are still included in IRIS Performer 2.2.
  2101.  
  2102.        A new kind of pfMemory, pfCycleBuffer supports changing data
  2103.        in a pipelined, multiprocessing environment while
  2104.        maintaining data exclusion and frame-accurate behavior. A
  2105.  
  2106.  
  2107.  
  2108.  
  2109.  
  2110.  
  2111.  
  2112.  
  2113.  
  2114.  
  2115.  
  2116.                                   - 33 -
  2117.  
  2118.  
  2119.  
  2120.        pfCycleBuffer manages a set of buffers called pfCycleMemorys
  2121.        and "rotates" them each frame, advancing the data
  2122.        modifications cleanly down the processing pipeline. libpf
  2123.        transparently handles the buffer rotations.
  2124.  
  2125.  
  2126.        6.7.2.10  _p_f_P_o_l_y_t_o_p_e
  2127.        A pfPolytope is a set of N half spaces whose intersection
  2128.        defines a possibly semi-infinite, convex volume which is
  2129.        useful for culling and intersection testing where a tighter
  2130.        bound than a pfSphere, pfBox, pfCylinder, pfFrustum is of
  2131.        benefit.
  2132.  
  2133.  
  2134.        6.7.2.11  _p_f_G_L_O_v_e_r_r_i_d_e
  2135.        Adds the ability to force the use of a particular GL
  2136.        mechanism to implement a libpr feature.
  2137.  
  2138.  
  2139.        6.7.2.12  _p_f_N_o_t_i_f_y
  2140.        pfNotify has been enhanced with new formatting and modes
  2141.        (PFNFY_MORE).  Refer to the pfNotify man page for full
  2142.        details.
  2143.  
  2144.  
  2145.        6.7.2.13  _p_f_G_e_t_T_i_m_e
  2146.        New functions. Refer to the reference pages for further
  2147.        information.
  2148.  
  2149.            ppppffffWWWWrrrraaaappppCCCClllloooocccckkkk
  2150.  
  2151.            ppppffffCCCClllloooocccckkkkNNNNaaaammmmeeee
  2152.  
  2153.            ppppffffCCCClllloooocccckkkkMMMMooooddddeeee
  2154.  
  2155.        6.7.2.14  _W_i_n_d_o_w__S_y_s_t_e_m__R_o_u_t_i_n_e_s
  2156.        New window-system interface functions provide a single API
  2157.        for creating and managing windows that works across the IRIS
  2158.        GL, IRIS GLX Mixed Mode, and OpenGL-X environments.  Window
  2159.        system independent types have been provided to match the X
  2160.        Window System types to provide complete portability between
  2161.        the IRIS GL and OpenGL-X windowing environments.
  2162.  
  2163.  
  2164.        6.7.2.15  _p_f_Q_u_e_r_y_F_e_a_t_u_r_e_/_p_f_Q_u_e_r_y_S_y_s
  2165.        New QueryFeature routines determine the presence, absence,
  2166.        or limitations of features in the underlying graphics
  2167.        implementation, like the availability of attenuation in the
  2168.        lighting model or the availability of multiple graphics
  2169.        pipes.
  2170.  
  2171.  
  2172.  
  2173.  
  2174.  
  2175.  
  2176.  
  2177.  
  2178.  
  2179.  
  2180.  
  2181.  
  2182.                                   - 34 -
  2183.  
  2184.  
  2185.  
  2186.        The QuerySys routines determine the capacity and limitations
  2187.        of the underlying graphics implementation, like the size of
  2188.        texture memory or the number of stencil planes available.
  2189.  
  2190.  
  2191.        6.7.2.16  _p_f_T_e_x_t_u_r_e__e_x_t_e_n_s_i_o_n_s
  2192.  
  2193.        6.7.2.17  _I_n_t_e_g_r_a_t_e_d__T_e_x_t__S_u_p_p_o_r_t
  2194.        Two and Three dimensional font rendering is supported by the
  2195.        new pfFont (libpr), pfString (libpr), and pfText (libpf)
  2196.        primitives.
  2197.  
  2198.        The pfFont facility provides the capability to load fonts
  2199.        for 3-D rendering with the string drawing routines from
  2200.        pfString and pfText.  IRIS Performer uses this facility to
  2201.        provide flat, extruded, and textured-quad fonts in three
  2202.        dimensions.
  2203.  
  2204.        pfString provides a pfGeoSet like facility for encapsulating
  2205.        geometry to display a string in 3-D with attributes such as
  2206.        color, arbitrary transformation matrix, and font (see
  2207.        pfFont).
  2208.  
  2209.        A pfText node is a list of pfStrings much as a pfGeode is a
  2210.        list of pfGeoSets. The two APIs are also similar - a new
  2211.        pfText node can be created and the list of pfStrings
  2212.        attached to it can be manipulated by addition, insertion,
  2213.        removal or replacement.
  2214.  
  2215.        The best examples of these new font tools at present are
  2216.        hello.c and helloC.C, both provided in the IRIS Performer
  2217.        source directory.
  2218.  
  2219.  
  2220.        6.7.2.18  _p_f_Q_u_a_t
  2221.        A full set of quaternion utilities is defined in prmath.h
  2222.        and is documented in the pfQuat man page.
  2223.  
  2224.  
  2225.        6.7.3  _L_I_B_P_F__E_n_h_a_n_c_e_m_e_n_t_s
  2226.  
  2227.        6.7.3.1  _M_u_l_t_i_p_l_e__W_i_n_d_o_w_s__o_n__a__s_i_n_g_l_e__p_f_P_i_p_e
  2228.  
  2229.        Multiple windows can now be rendered from a single pfPipe.
  2230.        This allows a single drawing process to render to multiple
  2231.        windows on a single screen.  Libpf now requires use of the
  2232.        pfPipeWindow primitive for opening windows for pfPipes.  See
  2233.        the pfWindow and pfPipeWindow (pfConfigPWin()) reference
  2234.        pages for details.
  2235.  
  2236.  
  2237.  
  2238.  
  2239.  
  2240.  
  2241.  
  2242.  
  2243.  
  2244.  
  2245.  
  2246.  
  2247.  
  2248.                                   - 35 -
  2249.  
  2250.  
  2251.  
  2252.        6.7.3.2  _p_f_M_o_r_p_h
  2253.  
  2254.        Note that pfMorph node is obsolete in 2.2.  We recommand
  2255.        using pfFlux/pfEngines instead of pfCycleBuffer and pfMorph
  2256.        feature.
  2257.  
  2258.        pfMorph is a new group node intended for automatic morphing
  2259.        of pfGeoSet attributes: colors, normals, coordinates, and
  2260.        texture coordinates but which can morph any floating point
  2261.        values. pfMorph is triggered during the new APP traversal
  2262.        and linearly combines N source arrays into a single
  2263.        destination which is typically a pfCycleBuffer used as a
  2264.        pfGeoSet attribute array.  By modifying the source weights
  2265.        each frame, the application can produce sophisticated,
  2266.        frame-accurate effects such as facial and skeletal animation
  2267.        and morphed, geometric level-of-detail.
  2268.  
  2269.  
  2270.        6.7.3.3  _p_f_D_B_a_s_e
  2271.        The DBASE process is a new addition to the IRIS Performer
  2272.        multiprocessing family. It is similar to the ISECT process
  2273.        in that it can run asynchronously with respect to the main
  2274.        processing pipeline (APP->CULL->DRAW). Callback and trigger
  2275.        functions, pfDBaseFunc() and pfDBase() respectively, allow
  2276.        explicit control and customization of the DBASE function.
  2277.        The DBASE is intended for asynchronous database processing,
  2278.        particularly paging to and from disk when using large
  2279.        databases. Note that IRIS Performer does not provide a
  2280.        paging facility directly - rather it provides the tools
  2281.        which the application can use to implement database paging.
  2282.        Database deletions are carried out in pfDBase() and do not
  2283.        slow down the synchronous pipeline if DBASE is configured as
  2284.        a separate process.
  2285.  
  2286.  
  2287.        6.7.3.4  _p_f_B_u_f_f_e_r
  2288.        pfBuffer is the primary tool for asynchronous database
  2289.        manipulations. A pfBuffer isolates database changes to a
  2290.        given process, avoiding dangerous data collisions with other
  2291.        processes when multiprocessing.  Scene graphs built in an
  2292.        asynchronous process, such as the DBASE, do not affect the
  2293.        synchronous, real-time APP->CULL->DRAW pipeline and are
  2294.        quickly and safely merged into the main processing stream
  2295.        with pfMergeBuffer().
  2296.  
  2297.  
  2298.        6.7.3.5  _p_f_M_u_l_t_i_t_h_r_e_a_d
  2299.        pfMultithread adds a new multiprocessing dimension by
  2300.        multithreading a given IRIS Performer processing stage.
  2301.        Currently, only the CULL stage may be multithreaded such
  2302.        that thread culls a pfChannel. This is expected to be very
  2303.  
  2304.  
  2305.  
  2306.  
  2307.  
  2308.  
  2309.  
  2310.  
  2311.  
  2312.  
  2313.  
  2314.                                   - 36 -
  2315.  
  2316.  
  2317.  
  2318.        useful for MCO applications where many pfChannels per pipe
  2319.        cause the CULL stage to become a bottleneck.
  2320.  
  2321.  
  2322.        6.7.3.6  _P_F_T_R_A_V___A_P_P
  2323.        PFTRAV_APP is a new automated IRIS Performer traversal
  2324.        intended for behavior computation, event distribution and
  2325.        other application level functions. It is carried out in the
  2326.        APP process and is initiated directly by pfAppFrame() or
  2327.        automatically by pfSync(). A wrapper callback and callback
  2328.        data (pfAppFunc(), pfPassAppData()) and node callbacks and
  2329.        data (pfNodeTravFuncs(), pfNodeTravData()) provide
  2330.        application extensibility similar to that offered for the
  2331.        CULL, DRAW, and ISECT traversals.
  2332.  
  2333.  
  2334.        6.7.3.7  _p_f_C_h_a_n_D_a_t_a
  2335.        pfChannel passthrough data may be supplied by the
  2336.        application with pfChanData() rather than allocated by the
  2337.        pfChannel with pfAllocChanData().  This allows pfChannels to
  2338.        share a single passthrough data block.
  2339.  
  2340.  
  2341.        6.7.3.8  _p_f_C_h_a_n_C_u_l_l_P_t_o_p_e
  2342.        pfChanCullPtope() specifies that a pfChannel use a
  2343.        pfPolytope, rather than its viewing pfFrustum, for culling.
  2344.        This allows highly customized culling for specific
  2345.        environments where visibility can be predetermined to some
  2346.        extent, e.g., when in a room and looking through a door the
  2347.        cull volume can be shrunk to the door opening.
  2348.  
  2349.  
  2350.        6.7.3.9  _p_f_C_h_a_n_N_o_d_e_I_s_e_c_t_S_e_g_s
  2351.        pfChanNodeIsectSegs() is identical to pfNodeIsectSegs() but
  2352.        includes a pfChannel to evaluate pfLODs during the
  2353.        intersection traversal.  Thus, pfChanNodeIsectSegs()
  2354.        computes intersections with the same level-of-detail as is
  2355.        selected for rendering. This greatly simplifies operations
  2356.        such as terrain following on terrain which is modeled as
  2357.        levels-of-detail.
  2358.  
  2359.  
  2360.        6.7.3.10  _p_f_C_h_a_n_G_S_t_a_t_e_T_a_b_l_e
  2361.        pfChannels can provide a pfGeoState table which is accessed
  2362.        by indexed pfGeoSets. This simplifies the management of
  2363.        multiple views of a single database, such as infrared vs.
  2364.        out-the-window.
  2365.  
  2366.  
  2367.  
  2368.  
  2369.  
  2370.  
  2371.  
  2372.  
  2373.  
  2374.  
  2375.  
  2376.  
  2377.  
  2378.  
  2379.  
  2380.                                   - 37 -
  2381.  
  2382.  
  2383.  
  2384.        6.7.3.11  _p_f_V_i_d_e_o_R_a_t_e
  2385.        In release 1.2, IRIS Performer internally computed the rate
  2386.        of the video clock.  In 2.0, IRIS Performer now queries the
  2387.        video microcode for the video retrace rate or accepts the
  2388.        rate set by the application with pfVideoRate().
  2389.  
  2390.  
  2391.        6.7.3.12  _p_f_C_o_n_f_i_g_S_t_a_g_e
  2392.        pfStageConfigFunc() allows the specification of an
  2393.        initialization callback for each IRIS Performer processing
  2394.        stage. pfConfigStage() invokes specified initialization
  2395.        callbacks in the appropriate processes at the next
  2396.        pfFrame(). Initialization callbacks typically establish the
  2397.        initial conditions of a process. Examples include setting
  2398.        non-degrading priorities and locking processes to CPUs for
  2399.        real-time applications and downloading textures in the DRAW
  2400.        stage.
  2401.  
  2402.  
  2403.        6.7.3.13  _p_f_L_o_o_k_u_p_N_o_d_e
  2404.        pfLookupNode() extends pfFindNode by searching for a path-
  2405.        named node of a particular type, beginning at a specific
  2406.        node. This greatly simplifies finding named parts of a
  2407.        pfCloned subgraph.
  2408.  
  2409.  
  2410.        6.7.3.14  _p_f_S_c_e_n_e_G_S_t_a_t_e
  2411.        pfScenes can now reference a pfGeoState that defines the
  2412.        "global state" which may be inherited by other pfGeoStates
  2413.        within the scene.
  2414.  
  2415.  
  2416.        6.7.3.15  _p_f_G_e_t_S_C_S_M_a_t_P_t_r__a_n_d__p_f_G_e_t_D_C_S_M_a_t_P_t_r
  2417.        pfGetDCSMatPtr() returns a pointer to the pfDCS matrix for
  2418.        fast access. Likewise, pfGetSCSMatPtr() returns a pointer to
  2419.        the pfSCS matrix.
  2420.  
  2421.  
  2422.        6.7.3.16  _N_e_w__G_L_-_i_n_d_e_p_e_n_d_e_n_t__W_i_n_d_o_w_i_n_g__U_t_i_l_i_t_i_e_s
  2423.        IRIS Performer now provides utilities for opening, closing,
  2424.        and managing windows.  The same routines will manage pure
  2425.        IRIS GL windows, IRIS GL-X Mixed-Mode, and OpenGL-X windows.
  2426.        Libpf application will now use the new pfPipeWindow for
  2427.        opening IRIS Performer windows.  See the pfWindow (libpr)
  2428.        and pfPipeWindow (libpf) (pfConfigPWin()) reference pages
  2429.        for details.
  2430.  
  2431.  
  2432.        6.7.3.17  _A_P_I__C_h_a_n_g_e_s
  2433.        pfSelectCtab() is now pfApplyCtab()
  2434.        pfGetMallcoSize() is now pfGetSize()
  2435.  
  2436.  
  2437.  
  2438.  
  2439.  
  2440.  
  2441.  
  2442.  
  2443.  
  2444.  
  2445.  
  2446.                                   - 38 -
  2447.  
  2448.  
  2449.  
  2450.        pfGetHyperId() is now pfGetPipeHyperId()
  2451.  
  2452.  
  2453.        6.7.3.18  _R_e_f_e_r_e_n_c_e__C_o_u_n_t_i_n_g
  2454.        All pfObjects, including pfNodes now have a reference count.
  2455.        A pfGroup increments the reference count of all its
  2456.        children.
  2457.  
  2458.  
  2459.        6.7.3.19  _M_o_d_e__Q_u_e_r_y__S_e_m_a_n_t_i_c_s
  2460.        pfGetGStateAttr/Mode do not return the global values of
  2461.        inherited state elements. Instead NULL and -1 are returned.
  2462.        Use pfGetCurGStateAttr/Mode for 1.2 behavior.
  2463.  
  2464.  
  2465.        6.7.3.20  _V_i_d_e_o__C_l_o_c_k
  2466.        pfInitVClock() no longer starts and stops the video clock.
  2467.        Instead, use pfStart/StopVClock() to start and stop video
  2468.        interrupts. pfStart/StopVClock are only necessary for
  2469.        VGX/VGXT graphics and are ignored on other graphics.
  2470.  
  2471.  
  2472.        6.7.3.21  _p_f_P_i_p_e_S_c_r_e_e_n
  2473.        Proper multipipe operation now requires that pipes be
  2474.        assigned a screen (pfPipeScreen) before the first pfFrame().
  2475.        Otherwise, pipes will be automatically assigned a screen.
  2476.  
  2477.  
  2478.        6.7.3.22  _p_f_E_v_a_l_u_a_t_e_L_O_D
  2479.        pfEvaluateLOD() returns a floating point number indicating
  2480.        which child is selected by a given pfChannel. The fractional
  2481.        portion of the number is used for fading transitions.
  2482.  
  2483.  
  2484.        6.7.3.23  _p_f_L_O_D_S_t_a_t_e
  2485.        pfLODStates are used to specify how individual LOD's or
  2486.        groups of LODs will respond to stress and range.
  2487.        pfLODStates can either be explicitly set per LOD or set as
  2488.        an index into a list of pfLODStates provided to a pfChannel.
  2489.        Thus pfLODStates can make the same pfLOD behave differently
  2490.        in different channels as well as differently under different
  2491.        stress conditions.  pfLODStates ultimately modify the range
  2492.        and fade transition calculations made by performer when
  2493.        culling.  See pfLODState, pfLOD, and pfChannel.
  2494.  
  2495.  
  2496.        6.7.3.24  _p_f_L_O_D__e_n_h_a_n_c_e_m_e_n_t_s
  2497.        pfLODs now support per-pair transition zones for fade LOD
  2498.        See the pfLODTransition reference page.
  2499.  
  2500.        pfLODs now respond to stress by scaling LOD ranges and
  2501.  
  2502.  
  2503.  
  2504.  
  2505.  
  2506.  
  2507.  
  2508.  
  2509.  
  2510.  
  2511.  
  2512.                                   - 39 -
  2513.  
  2514.  
  2515.  
  2516.        transition zones and take a pfLODState structure to describe
  2517.        the desired stress behavior of a pfLOD. See the pfLODState
  2518.        reference page.
  2519.  
  2520.        LOD Priority Classes can be formed by the sharing of
  2521.        pfLODState structures across a set of LODs.
  2522.  
  2523.        Per-Channel LOD Priority Classes can be formed by assigning
  2524.        pfChannels with tables of pfLODStates and assigning pfLODs
  2525.        an index into these tables. See the pfChanLODAttr and
  2526.        pfLODLODStateIndex reference pages.
  2527.  
  2528.  
  2529.  
  2530.        6.7.4  _l_i_b_p_f_d_u__E_n_h_a_n_c_e_m_e_n_t_s
  2531.  
  2532.        6.7.4.1  _O_p_t_i_m_i_z_i_n_g__S_c_e_n_e__B_u_i_l_d_e_r__f_o_r__u_s_e__i_n__F_i_l_e__L_o_a_d_e_r_s
  2533.        Performer 2.0 contains a new layer of support for easily
  2534.        converting databases from external formats into performer
  2535.        runtime structures.  This new layer is called libpfdu which
  2536.        stands for library of performer database utilities.  The
  2537.        pfdBuilder contains mechanisms for completely converting
  2538.        external database formats and data into efficient IRIS
  2539.        performer structures.  The builder will take care of state
  2540.        sharing and sort your geometry by state.  Collections of
  2541.        graphics state and geometry are given to the pfdBuilder as a
  2542.        database is read in. At the end of reading a database file,
  2543.        a pfNode containing an efficient Performer representation of
  2544.        the database can be obtained.  This new API supersedes the
  2545.        previous pfuBuilder which was a simple interface for
  2546.        encapsulating geometric data into performer structures in an
  2547.        intuitive way.  This new layer of support is built on top of
  2548.        and is a superset of the previous pfuBuilder (which has now
  2549.        become the pfdGeoBuilder) that was released with Performer
  2550.        1.2.  Check out
  2551.  
  2552.            ////uuuussssrrrr////iiiinnnncccclllluuuuddddeeee////PPPPeeeerrrrffffoooorrrrmmmmeeeerrrr////ppppffffdddduuuu....hhhh
  2553.  
  2554.        for mode settings and api for the new extended builder.
  2555.  
  2556.        libpfdu is the Performer library of database utilities.  Its
  2557.        purpose is to provide helpful functions for constructing
  2558.        optimized Performer data structures and scene graphs.  It is
  2559.        used mainly by database loaders which take an external file
  2560.        format containing 3d geometry and graphics state and load
  2561.        them into Performer optimized run-time only structures.
  2562.        Note that these utilities often prove very useful as most
  2563.        modeling tools and file formats represent their data in
  2564.        structures that correspond to the way users model data and
  2565.        these data structures are often necessarily mutually
  2566.        exclusive with effective and efficient Performer run-time
  2567.  
  2568.  
  2569.  
  2570.  
  2571.  
  2572.  
  2573.  
  2574.  
  2575.  
  2576.  
  2577.  
  2578.                                   - 40 -
  2579.  
  2580.  
  2581.  
  2582.        structures.  libpfdu contains many utilities including dso
  2583.        support for database loaders and their modes, file path
  2584.        support, etc, but the heart of libpfdu is the notion of the
  2585.        Performer database 'builder' - pfdBuilder.
  2586.  
  2587.        The builder is a tool to allow users to input/output a
  2588.        collection of geometry and graphics state in immediate mode
  2589.        fashion (similar to Open/Iris GL).  Data is inputed to the
  2590.        builder one geometric primitive at a time along with its
  2591.        corresponding graphics state.  When all of the data has been
  2592.        inputed, the user simply requests optimized Performer data
  2593.        structures which can then be used as a part of a Performer
  2594.        Scene Graph.  The builder hashs geometry into different
  2595.        'bins' based on the geometry's attribute binding types and
  2596.        associated graphics state.  It also keeps track of graphics
  2597.        state elements (textures,materials,light models, fog,etc)
  2598.        and shares state elements whenever possible.  In the end,
  2599.        the builder will create Performer 'pfGeoSets' that contain
  2600.        triangle meshes created by running the original geometry
  2601.        through the libpfdu tmeshing utility.  To go along with each
  2602.        pfGeoSet, the builder builds up a Performer pfGeoState
  2603.        (Performer's encapsulated state primitive) which has been
  2604.        optimized to share as many attributes as possible with other
  2605.        pfGeoStates being build (and possibly even with a more
  2606.        global pfChannelGState).  Having created all of these
  2607.        Performer primitives (pfGeoSets and pfGeoStates) the builder
  2608.        will place them in a Performer leaf node (pfGeode), and
  2609.        possibly even artificially create a spatial hierarchy by
  2610.        running the new database through a spatial breakup utility
  2611.        function which is also contained in libpfdu.  Note that this
  2612.        builder should also allow the user to extend the notion of a
  2613.        'graphics state' by registering callback functionality
  2614.        through builder api and then treating this
  2615.        state/functionality like any other Performer state/mode
  2616.        (although such uses of the builder are of course at least
  2617.        slightly more complicated).
  2618.  
  2619.        In short libpfdu is a collection of utilities that
  2620.        effectively act as a data funnel where users input flattened
  2621.        3d graphics information and are given in return fully
  2622.        functional and hopefully well optimized Performer run-time
  2623.        structures.
  2624.  
  2625.  
  2626.  
  2627.        6.7.5  _l_i_b_p_f_d_b__E_n_h_a_n_c_e_m_e_n_t_s
  2628.  
  2629.        6.7.5.1  _N_e_w__F_i_l_e__F_o_r_m_a_t_s   OpenInventor 2.0 file support.
  2630.        This is a completely new loader that uses OpenInventor
  2631.        traversal of the input scene graph to create the Performer
  2632.        scene graph, allowing robust conversion of all geometry.
  2633.  
  2634.  
  2635.  
  2636.  
  2637.  
  2638.  
  2639.  
  2640.  
  2641.  
  2642.  
  2643.  
  2644.                                   - 41 -
  2645.  
  2646.  
  2647.  
  2648.        AutoDesk 3DStudio file support using the 3dsftk.
  2649.  
  2650.        Side Effects Software Prisms (.poly and .bpoly) file
  2651.        support.
  2652.  
  2653.        Medit Productions Medit (.medit) file support
  2654.  
  2655.        S1000 file support, based on code from Texas Instruments.
  2656.  
  2657.        Several other formats. Look in libpfdb for the complete
  2658.        list.
  2659.  
  2660.  
  2661.        6.7.6  _S_t_r_u_c_t_u_r_a_l__C_h_a_n_g_e_s
  2662.  
  2663.        6.7.6.1  _C_l_a_s_s__s_t_r_u_c_t_u_r_e
  2664.        One of the major differences from 1.2 is that libpr is now
  2665.        written in C++ and the class tree has changed. 1.2 had both
  2666.        a prObject and pfObject - now there is a single pfObject
  2667.        which is derived from IRIS Performer's base class, pfMemory.
  2668.        There are no more pr-prefixed routines which were used for
  2669.        libpr->libpf inheritance, e.g, pfLight -> pfLightSource.
  2670.  
  2671.  
  2672.        6.7.6.2  _p_f_T_y_p_e
  2673.        IRIS Performer has changed its type system to support new,
  2674.        application-derived types. pfGetType() now returns a pfType*
  2675.        instead of a bitmask. Each IRIS Performer data type which
  2676.        has an explicit allocator (usually pfNew*()) has an
  2677.        associated pfType which is created at initialization time by
  2678.        pfInit().  The pfType corresponding to a particular class is
  2679.        returned by pfGet<*>ClassType(), e.g.,
  2680.        pfGetGroupClassType().
  2681.  
  2682.        The primary difference in 2.0 is the fact that types are no
  2683.        longer represented with bitmasks where the inheritance chain
  2684.        of a particular type is encoded in the bitmask, e.g.,
  2685.        PFTYPE_SCS == (100 | PFCLASS_SCS | PFCLASS_GROUP |
  2686.        PFCLASS_NODE), indicating that SCS is derived from pfGroup
  2687.        and pfNode.  pfType is an opaque data structure whose
  2688.        inheritance chain must be queried through pfIsOfType().
  2689.  
  2690.        Here are the old and new methods for testing an object for
  2691.        exact type equality. The 1.2 method:
  2692.  
  2693.            iiiiffff ((((ppppffffGGGGeeeettttTTTTyyyyppppeeee((((nnnnooooddddeeee)))) ======== PPPPFFFFTTTTYYYYPPPPEEEE____SSSSCCCCSSSS))))
  2694.  
  2695.        and the 2.0 methods, which are equivalent
  2696.  
  2697.            iiiiffff ((((ppppffffGGGGeeeettttTTTTyyyyppppeeee((((nnnnooooddddeeee)))) ======== ppppffffGGGGeeeettttSSSSCCCCSSSSCCCCllllaaaassssssssTTTTyyyyppppeeee(((())))))))
  2698.  
  2699.  
  2700.  
  2701.  
  2702.  
  2703.  
  2704.  
  2705.  
  2706.  
  2707.  
  2708.  
  2709.  
  2710.                                   - 42 -
  2711.  
  2712.  
  2713.  
  2714.            iiiiffff ((((ppppffffIIIIssssEEEExxxxaaaaccccttttTTTTyyyyppppeeee((((nnnnooooddddeeee,,,, ppppffffGGGGeeeettttSSSSCCCCSSSSCCCCllllaaaassssssssTTTTyyyyppppeeee(((())))))))))))
  2715.  
  2716.        Here are the old and new methods for testing an object for
  2717.        derivation from a give type. The 1.2 method:
  2718.  
  2719.            iiiiffff ((((ppppffffGGGGeeeettttTTTTyyyyppppeeee((((nnnnooooddddeeee)))) &&&& PPPPFFFFCCCCLLLLAAAASSSSSSSS____GGGGRRRROOOOUUUUPPPP))))
  2720.  
  2721.        and the 2.0 method
  2722.  
  2723.            iiiiffff ((((ppppffffIIIIssssOOOOffffTTTTyyyyppppeeee((((nnnnooooddddeeee,,,, ppppffffGGGGeeeettttGGGGrrrroooouuuuppppCCCCllllaaaassssssssTTTTyyyyppppeeee(((())))))))))))
  2724.  
  2725.        Special care should be taken when porting to the new type
  2726.        API.
  2727.  
  2728.  
  2729.        6.7.7  _C_h_a_n_g_e_s__i_n__l_i_b_p_r
  2730.  
  2731.        6.7.7.1  _D_e_f_a_u_l_t__E_n_a_b_l_e_s
  2732.        PFEN_TEXTURE, PFEN_LIGHTING, PFEN_FOG are no longer enabled
  2733.        by default.  Databases created with loaders that assumed
  2734.        specific global defaults, e.g., pfEnable(PFEN_TEXTURE) will
  2735.        be rendered improperly. All IRIS Performer loaders shipped
  2736.        with 2.0 create pfGeoStates that assume the global default
  2737.        is the same as that set by pfBasicState(), i.e., everything
  2738.        is OFF.
  2739.  
  2740.  
  2741.        6.7.7.2  _L_i_n_e__W_i_d_t_h__a_n_d__P_o_i_n_t__S_i_z_e
  2742.        pfGeoSets with linewidth/pointsize of <= 0 will not set
  2743.        linewidth or pointsize but will inherit it through the GL.
  2744.  
  2745.  
  2746.        6.7.7.3  _A_l_p_h_a__R_e_f_e_r_e_n_c_e__V_a_l_u_e
  2747.        The PFSTATE_ALPHAREF state element has changed from an
  2748.        integer in the range 0-255 to a float in the range 0-1 and
  2749.        is now set on pfGeoStates with the new routine, pfGStateVal.
  2750.        A warning will be generated if set through pfGStateMode.
  2751.  
  2752.  
  2753.        6.7.7.4  _D_e_c_a_l__I_m_p_l_e_m_e_n_t_a_t_i_o_n
  2754.        pfDecal no longer sets zwritemask to 0 when drawing
  2755.        displaced layers.  This allows layers to be drawn separately
  2756.        from their bases, enabling improved sorting by graphics
  2757.        mode.
  2758.  
  2759.  
  2760.        6.7.7.5  _M_a_t_h__F_u_n_c_t_i_o_n_s
  2761.        pfXformPt3/Vec3 previously considered the last column of the
  2762.        matrix and divided by the homogeneous coordinate, w. The new
  2763.        pfXformPt3/Vec3 are much faster and treats the pfMatrix as a
  2764.        4x3 matrix.  The old behavior is now accessed through the
  2765.  
  2766.  
  2767.  
  2768.  
  2769.  
  2770.  
  2771.  
  2772.  
  2773.  
  2774.  
  2775.  
  2776.                                   - 43 -
  2777.  
  2778.  
  2779.  
  2780.        new pfFullXformPt3/Vec3 routines.
  2781.  
  2782.        pfInvertMat is now named pfInvertFullMat but a #define
  2783.        ensures 1.2 compatibility.
  2784.  
  2785.        pfMakeRotOntoMat is obsoleted in favor of the much faster
  2786.        pfMakeVecRotVecMat which assumes normalized input vectors.
  2787.  
  2788.  
  2789.        6.7.7.6  _F_r_u_s_t_u_m__S_p_e_c_i_f_i_c_a_t_i_o_n
  2790.        pfFrustAspect is no longer persistent. In 1.2, automatic
  2791.        frustum calculation (e.g. PFFRUST_CALC_HORIZ) was always in
  2792.        effect once set. In 2.0, pfFrustAspect recomputes the
  2793.        frustum only at time of invocation.
  2794.  
  2795.  
  2796.        6.7.8  _C_h_a_n_g_e_s__i_n__l_i_b_p_f
  2797.  
  2798.        6.7.8.1  _D_e_f_a_u_l_t__E_n_a_b_l_e_s
  2799.        PFEN_TEXTURE, PFEN_LIGHTING, PFEN_FOG are no longer enabled
  2800.        by default.  Databases created with loaders that assumed
  2801.        specific global defaults, e.g., pfEnable(PFEN_TEXTURE) will
  2802.        be rendered improperly. All IRIS Performer loaders shipped
  2803.        with 2.0 create pfGeoStates which assume the global default
  2804.        is the same as that set by pfBasicState(), i.e., everything
  2805.        is OFF. To achieve 1.2 behavior with 1.2 loaders, call the
  2806.        following in the DRAW process after the window is opened:
  2807.  
  2808.            ppppffffEEEEnnnnaaaabbbblllleeee((((PPPPFFFFEEEENNNN____LLLLIIIIGGGGHHHHTTTTIIIINNNNGGGG))));;;;
  2809.  
  2810.            ////**** OOOOnnnnllllyyyy oooonnnn IIIInnnnffffiiiinnnniiiitttteeeeRRRReeeeaaaalllliiiittttyyyy////RRRReeeeaaaalllliiiittttyyyyEEEEnnnnggggiiiinnnneeee////IIIImmmmppppaaaacccctttt////VVVVGGGGXXXXTTTT////VVVVGGGGXXXX ****////
  2811.            ppppffffEEEEnnnnaaaabbbblllleeee((((PPPPFFFFEEEENNNN____TTTTEEEEXXXXTTTTUUUURRRREEEE))));;;;
  2812.  
  2813.            ppppffffEEEEnnnnaaaabbbblllleeee((((PPPPFFFFEEEENNNN____FFFFOOOOGGGG))));;;;
  2814.  
  2815.        6.7.8.2  _M_u_l_t_i_-_c_h_a_n_n_e_l__f_o_g__a_n_d__l_i_g_h_t_i_n_g__c_o_n_s_i_s_t_e_n_c_y
  2816.        pfChannels now encode rotational offsets (pfChanViewOffsets)
  2817.        in the ModelView instead of the Projection matrix.
  2818.        Consequently, fog always matches across adjacent pfChannels
  2819.        but for proper lighting, a local viewer lighting model is
  2820.        required (pfLModelLocal).
  2821.  
  2822.  
  2823.        6.7.8.3  _T_y_p_e__i_n_h_e_r_i_t_a_n_c_e
  2824.        Multiple inheritance through the C API is gone. Previously,
  2825.        pfChannels could use pfFrustum API, e.g.,
  2826.        pfMakePerspFrust(chan,...) pfFrameStats could use pfStats
  2827.        API, and pfLightSources could use pfLight API, e.g.,
  2828.        pfLightPos(lsource...). Additional routines are now provided
  2829.        to maintain the same functionality without the complexities
  2830.        of multiple inheritance. The new routines name are simply
  2831.  
  2832.  
  2833.  
  2834.  
  2835.  
  2836.  
  2837.  
  2838.  
  2839.  
  2840.  
  2841.  
  2842.                                   - 44 -
  2843.  
  2844.  
  2845.  
  2846.        the old routines where the "base" class name is replaced
  2847.        with the "derived" class name. For example, pfMakePerspFrust
  2848.        becomes pfMakePerspChan and pfLightPos becomes pfLSourcePos.
  2849.        Comprehensive tables illustrating the correspondence between
  2850.        routine names are found in pfChannel, pfFrameStats, and
  2851.        pfLightSource man pages.
  2852.  
  2853.  
  2854.        6.7.8.4  _F_r_u_s_t_u_m__S_p_e_c_i_f_i_c_a_t_i_o_n
  2855.        Customizing a viewing frustum with pfMakePerspChan or
  2856.        pfMakeOrthoChan now disables the automatic viewport aspect
  2857.        ratio matching feature of pfChannel (pfChanAutoAspect).
  2858.  
  2859.  
  2860.        6.7.8.5  _A_P_I__C_h_a_n_g_e_s
  2861.        pfChanCullFunc and pfChanDrawFunc are now subsumed by
  2862.        pfChanTravFunc.
  2863.  
  2864.        pfStageConfigFunc() and pfConfigStage() replace the now
  2865.        obsolete pfInitPipe().
  2866.  
  2867.  
  2868.        6.7.8.6  _B_u_g__f_i_x
  2869.        PFPHASE_FLOAT and PFPHASE_LOCK now work in single process
  2870.        mode.
  2871.  
  2872.  
  2873.        6.7.8.7  _p_f_S_w_i_t_c_h__s_e_m_a_n_t_i_c_s
  2874.        pfSwitchVal() used to determine the validity of the switch
  2875.        value which was problematic if no children had been added to
  2876.        the pfSwitch yet. The validity check is now deferred to
  2877.        individual traversal routines.
  2878.  
  2879.  
  2880.        6.7.8.8  _p_f_D_a_t_a_P_o_o_l_s
  2881.        When Performer shared memory has been created, pfDataPools
  2882.        are now positioned in the virtual address space so that
  2883.        conflicts are less likely to arise.  Such conflicts were a
  2884.        frequent cause of failures of pfAttachDPool.  Deleting a
  2885.        data pool now detaches it from the address space.
  2886.  
  2887.  
  2888.        6.7.8.9  _p_f_P_a_r_t_i_t_i_o_n_s
  2889.        Allow better specification of the spacing and positioning of
  2890.        the spatial partition to reduce construction time. They also
  2891.        work now.
  2892.  
  2893.  
  2894.        6.7.8.10  _O_t_h_e_r__C_h_a_n_g_e_s
  2895.  
  2896.  
  2897.  
  2898.  
  2899.  
  2900.  
  2901.  
  2902.  
  2903.  
  2904.  
  2905.  
  2906.  
  2907.  
  2908.                                   - 45 -
  2909.  
  2910.  
  2911.  
  2912.        6.7.8.11  _E_l_i_m_i_n_a_t_i_o_n__o_f__m_u_l_t_i_p_l_e__i_n_h_e_r_i_t_a_n_c_e
  2913.        The CAPI inheritance of pfChannel from pfFrustum,
  2914.        pfLightSource from pfLight and pfFrameStats from pfStats has
  2915.        been removed.  API has been added on the formerly derived to
  2916.        duplicate the functionality of the former base class, e.g.
  2917.        pfApplyFrust(chan) -> pfApplyChan(chan).
  2918.  
  2919.  
  2920.        6.7.8.12  _L_i_g_h_t__M_o_d_e_l__A_t_t_e_n_u_a_t_i_o_n__v_s__L_i_g_h_t__A_t_t_e_n_u_a_t_i_o_n
  2921.        IRIS GL: Light Attenuation is on the pfLightModel
  2922.  
  2923.            vvvvooooiiiidddd ppppffffLLLLMMMMooooddddeeeellllAAAAtttttttteeeennnn((((ppppffffLLLLiiiigggghhhhttttMMMMooooddddeeeellll**** llllmmmm,,,,
  2924.                ffffllllooooaaaatttt aaaa0000,,,, ffffllllooooaaaatttt aaaa1111,,,, ffffllllooooaaaatttt aaaa2222))));;;;
  2925.  
  2926.            vvvvooooiiiidddd ppppffffGGGGeeeettttLLLLMMMMooooddddeeeellllAAAAtttttttteeeennnn((((ppppffffLLLLiiiigggghhhhttttMMMMooooddddeeeellll**** llllmmmm,,,,
  2927.                ffffllllooooaaaatttt**** aaaa0000,,,, ffffllllooooaaaatttt**** aaaa1111,,,, ffffllllooooaaaatttt**** aaaa2222))));;;;
  2928.  
  2929.        OpenGL: Light Attenuation is on the pfLight
  2930.  
  2931.            vvvvooooiiiidddd ppppffffLLLLiiiigggghhhhttttAAAAtttttttteeeennnn((((ppppffffLLLLiiiigggghhhhtttt**** lllltttt,,,,
  2932.                ffffllllooooaaaatttt aaaa0000,,,, ffffllllooooaaaatttt aaaa1111,,,, ffffllllooooaaaatttt aaaa2222))));;;;
  2933.  
  2934.            vvvvooooiiiidddd ppppffffGGGGeeeettttLLLLiiiigggghhhhttttAAAAtttttttteeeennnn((((ppppffffLLLLiiiigggghhhhtttt**** lllltttt,,,,
  2935.                ffffllllooooaaaatttt**** aaaa0000,,,, ffffllllooooaaaatttt**** aaaa1111,,,, ffffllllooooaaaatttt**** aaaa2222))));;;;
  2936.  
  2937.        6.7.8.13  _p_f_A_l_p_h_a_F_u_n_c__n_o_w__t_a_k_e_s__a__f_l_o_a_t__f_o_r__r_e_f
  2938.  
  2939.            wwwwaaaassss:::: vvvvooooiiiidddd ppppffffAAAAllllpppphhhhaaaaFFFFuuuunnnncccc((((iiiinnnntttt rrrreeeeffff,,,, iiiinnnntttt ffffuuuunnnncccc))));;;;
  2940.  
  2941.            nnnneeeewwww:::: vvvvooooiiiidddd ppppffffAAAAllllpppphhhhaaaaFFFFuuuunnnncccc((((ffffllllooooaaaatttt rrrreeeeffff,,,, iiiinnnntttt ffffuuuunnnncccc))));;;;
  2942.  
  2943.        6.7.8.14  _p_f_G_e_t_A_l_p_h_a_F_u_n_c__n_o_w__r_e_t_u_r_n_s__a__f_l_o_a_t__f_o_r__r_e_f
  2944.  
  2945.            wwwwaaaassss:::: vvvvooooiiiidddd ppppffffGGGGeeeettttAAAAllllpppphhhhaaaaFFFFuuuunnnncccc((((iiiinnnntttt ****rrrreeeeffff,,,, iiiinnnntttt ****ffffuuuunnnncccc))));;;;
  2946.  
  2947.            nnnneeeewwww:::: vvvvooooiiiidddd ppppffffGGGGeeeettttAAAAllllpppphhhhaaaaFFFFuuuunnnncccc((((ffffllllooooaaaatttt ****rrrreeeeffff,,,, iiiinnnntttt ****ffffuuuunnnncccc))));;;;
  2948.  
  2949.        6.7.8.15  _p_f_G_S_t_a_t_e_M_o_d_e__a_n_d__p_f_G_e_t_G_S_t_a_t_e_M_o_d_e
  2950.        pf{Get}GStateMode can no longer accept the PFSTATE_ALPHAREF
  2951.        token.  Use
  2952.  
  2953.            ppppffffGGGGSSSSttttaaaatttteeeeVVVVaaaallll((((ggggssssttttaaaatttteeee,,,, PPPPFFFFSSSSTTTTAAAATTTTEEEE____AAAALLLLPPPPHHHHAAAARRRREEEEFFFF,,,, vvvvaaaallll))));;;;
  2954.  
  2955.        6.7.8.16  _p_f_L_i_g_h_t_C_o_l_o_r__a_n_d__p_f_G_e_t_L_i_g_h_t_C_o_l_o_r
  2956.        pfLightColor and pfGetLightColor now take arguments to
  2957.        specify which color.
  2958.  
  2959.            wwwwaaaassss:::: ppppffffLLLLiiiigggghhhhttttAAAAmmmmbbbbiiiieeeennnntttt aaaannnndddd ppppffffGGGGeeeettttLLLLiiiigggghhhhttttAAAAmmmmbbbbiiiieeeennnntttt aaaarrrreeee oooobbbbssssoooolllleeeetttteeee....
  2960.  
  2961.            nnnneeeewwww:::: vvvvooooiiiidddd ppppffffLLLLiiiigggghhhhttttCCCCoooolllloooorrrr((((ppppffffLLLLiiiigggghhhhtttt**** lllltttt,,,, iiiinnnntttt wwwwhhhhiiiicccchhhh,,,,
  2962.                    ffffllllooooaaaatttt rrrr,,,, ffffllllooooaaaatttt gggg,,,, ffffllllooooaaaatttt bbbb))));;;;
  2963.  
  2964.  
  2965.  
  2966.  
  2967.  
  2968.  
  2969.  
  2970.  
  2971.  
  2972.  
  2973.  
  2974.                                   - 46 -
  2975.  
  2976.  
  2977.  
  2978.            nnnneeeewwww:::: vvvvooooiiiidddd ppppffffGGGGeeeettttLLLLiiiigggghhhhttttCCCCoooolllloooorrrr((((ppppffffLLLLiiiigggghhhhtttt**** lllltttt,,,, iiiinnnntttt wwwwhhhhiiiicccchhhh,,,,
  2979.                    ffffllllooooaaaatttt**** rrrr,,,, ffffllllooooaaaatttt**** gggg,,,, ffffllllooooaaaatttt**** bbbb))));;;;
  2980.  
  2981.        6.7.8.17  _p_f_I_n_i_t_G_f_x
  2982.        pfInitGfx() has changed API, location and behavior:
  2983.  
  2984.            wwwwaaaassss:::: vvvvooooiiiidddd ppppffffIIIInnnniiiittttGGGGffffxxxx((((ppppffffPPPPiiiippppeeee ****pppp))));;;;
  2985.  
  2986.            nnnneeeewwww:::: ppppffffIIIInnnniiiittttGGGGffffxxxx((((vvvvooooiiiidddd))));;;;
  2987.  
  2988.        pfInitGfx() should now be used to initialize all pfWindows
  2989.        and pfPipeWindows.
  2990.  
  2991.  
  2992.        6.7.8.18  _p_f_I_n_i_t_G_L_X_G_f_x
  2993.        pfInitGLXGfx(pfPipe *) has been removed. Use the
  2994.        pfPipeWindow utilities.
  2995.  
  2996.  
  2997.        6.7.8.19  _p_f_G_e_t_P_i_p_e_W_i_n__a_n_d__p_f_G_e_t_P_i_p_e_G_L_X_W_i_n_s
  2998.        pfGetPipeWin and pfGetPipeGLXWins have been removed. There
  2999.        is now pfGetPipePWin() to support this functionality.
  3000.  
  3001.  
  3002.        6.7.8.20  _p_f_I_n_i_t_P_i_p_e
  3003.        pfInitPipe() is obsoleted in favor of pfStageConfigFunc()
  3004.        and pfConfigStage().  pfInitPipe() no longer is used to
  3005.        create windows.  Use pfConfigPWin for a window
  3006.        initialization callback.  Use pfConfigStage for initializing
  3007.        (or later re-configuring) the CULL or DRAW processes
  3008.        (stages) for a given pipe.
  3009.  
  3010.  
  3011.        6.7.8.21  _p_f_G_e_t_P_i_p_e_O_r_i_g_i_n
  3012.        pfGetPipeOrigin() has been removed.  Use pfGetWinOrigin() or
  3013.        pfGetPWinOrigin() to get the size of a pfWindow or
  3014.        pfPipeWindow respectively.
  3015.  
  3016.  
  3017.        6.7.8.22  _p_f_G_e_t_P_i_p_e_S_i_z_e
  3018.        pfGetPipeSize() now returns the screen size of a pfPipe. Use
  3019.        pfGetWinSize() or pfGetPWinSize() to get the size of a
  3020.        pfWindow or pfPipeWindow respectively.
  3021.  
  3022.  
  3023.        6.7.8.23  _p_f_u_W_i_d_g_e_t_F_u_n_c__r_e_n_a_m_e_d
  3024.        pfuWidgetFunc() is now pfuWidgetActionFunc().
  3025.  
  3026.  
  3027.  
  3028.  
  3029.  
  3030.  
  3031.  
  3032.  
  3033.  
  3034.  
  3035.  
  3036.  
  3037.  
  3038.  
  3039.  
  3040.                                   - 47 -
  3041.  
  3042.  
  3043.  
  3044.        6.7.8.24  _p_f_u_E_n_a_b_l_e_P_a_n_e_l
  3045.        pfuEnablePanel() no longer takes an enable argument.
  3046.        Instead, pfuPanels are enabled/disabled with
  3047.        pfuEnablePanel() and pfuDisablePanel() respectively.
  3048.  
  3049.  
  3050.        6.7.8.25  _p_f_u_G_e_t_P_a_n_e_l_S_i_z_e
  3051.        pfuGetPanelSize now follows standard convention of (xo, yo,
  3052.        xs, ys) parameter ordering.
  3053.  
  3054.            wwwwaaaassss:::: ppppffffuuuuGGGGeeeettttPPPPaaaannnneeeellllSSSSiiiizzzzeeee((((ppppffffuuuuPPPPaaaannnneeee ****pppp,,,,
  3055.                     iiiinnnntttt ****xxxxoooo,,,, iiiinnnntttt ****xxxxssss,,,, iiiinnnntttt ****yyyyoooo,,,, iiiinnnntttt ****yyyyssss))));;;;
  3056.  
  3057.            nnnneeeewwww:::: ppppffffuuuuGGGGeeeettttPPPPaaaannnneeeellllOOOOrrrrggggSSSSiiiizzzzeeee((((ppppffffuuuuPPPPaaaannnneeee ****pppp,,,,
  3058.                     iiiinnnntttt ****xxxxoooo,,,, iiiinnnntttt ****yyyyoooo,,,, iiiinnnntttt ****xxxxssss,,,, iiiinnnntttt ****yyyyssss))));;;;
  3059.  
  3060.        6.7.8.26  _p_f_I_n_i_t_P_W_i_n
  3061.        pfInitPWin is now pfConfigPWin
  3062.  
  3063.  
  3064.  
  3065.  
  3066.  
  3067.  
  3068.  
  3069.  
  3070.  
  3071.  
  3072.  
  3073.  
  3074.  
  3075.  
  3076.  
  3077.  
  3078.  
  3079.  
  3080.  
  3081.  
  3082.  
  3083.  
  3084.  
  3085.  
  3086.  
  3087.  
  3088.  
  3089.  
  3090.  
  3091.  
  3092.  
  3093.  
  3094.  
  3095.  
  3096.  
  3097.  
  3098.  
  3099.  
  3100.  
  3101.  
  3102.  
  3103.